Final merge of HEAD (bf-blender) into the orange branch.
authorChris Want <cwant@ualberta.ca>
Sat, 28 Jan 2006 16:35:18 +0000 (16:35 +0000)
committerChris Want <cwant@ualberta.ca>
Sat, 28 Jan 2006 16:35:18 +0000 (16:35 +0000)
Here are my notes on things to look out for as potential problem
spots:

source/blender/blenkernel/intern/displist.c:
+ is initfastshade(void) supposed to be empty? I had
to make it empty to get the merged tree to compile.

source/blender/python/api2_2x/Armature.c:
+ went with the version that had Armature_getLayers()

source/blender/python/api2_2x/Object.c
+ went with the version of Object_getPose() from bf-blender.
(#ifdef 0-ed the other version)

source/blender/python/api2_2x/Pose.[ch]
+ had problems linking due to no Pose_Init() ... copied these
two files straight from bf-blender.

source/blender/src/drawview.c:
+ view3d_panel_properties() had things shifted a few things shifted
a few pixels, otherwise, things were painless

source/blender/src/splash.jpg.c:
+ went with bf-blender version (orange is dead)

source/gameengine:
+ went with bf-blender version -- does not compile due to IMB_rect* stuff,
Ton should look into this.

90 files changed:
source/Makefile
source/blender/blenkernel/BKE_blender.h
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/python/BPY_interface.c
source/blender/python/SConscript
source/blender/python/api2_2x/Armature.c
source/blender/python/api2_2x/Armature.h
source/blender/python/api2_2x/BezTriple.c
source/blender/python/api2_2x/Bone.c
source/blender/python/api2_2x/Bone.h
source/blender/python/api2_2x/Key.c
source/blender/python/api2_2x/Mesh.c
source/blender/python/api2_2x/NLA.c
source/blender/python/api2_2x/NLA.h
source/blender/python/api2_2x/NMesh.c
source/blender/python/api2_2x/Object.c
source/blender/python/api2_2x/Pose.c
source/blender/python/api2_2x/Pose.h
source/blender/python/api2_2x/Window.c
source/blender/python/api2_2x/constant.c
source/blender/python/api2_2x/doc/API_intro.py
source/blender/python/api2_2x/doc/Armature.py
source/blender/python/api2_2x/doc/Ipo.py
source/blender/python/api2_2x/doc/Key.py
source/blender/python/api2_2x/doc/Mathutils.py
source/blender/python/api2_2x/doc/Mesh.py
source/blender/python/api2_2x/doc/Object.py
source/blender/python/api2_2x/doc/Theme.py
source/blender/python/api2_2x/doc/Window.py
source/blender/python/api2_2x/matrix.c
source/blender/python/api2_2x/vector.c
source/blender/python/api2_2x/windowTheme.c
source/blender/src/buttons_editing.c
source/blender/src/buttons_logic.c
source/blender/src/drawseq.c
source/blender/src/drawsound.c
source/blender/src/editoops.c
source/blender/src/filesel.c
source/blender/src/header_filesel.c
source/blender/src/header_imasel.c
source/blender/src/header_ipo.c
source/blender/src/header_oops.c
source/blender/src/header_script.c
source/blender/src/header_seq.c
source/blender/src/header_text.c
source/blender/src/header_view3d.c
source/blender/src/interface.c
source/blender/src/interface_draw.c
source/blender/src/renderwin.c
source/blender/src/space.c
source/blender/src/splash.jpg.c
source/blender/src/toolbox.c
source/blender/src/transform_generics.c
source/blender/src/view.c
source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
source/gameengine/Converter/BL_ActionActuator.cpp
source/gameengine/Converter/BL_BlenderDataConversion.cpp
source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
source/gameengine/GamePlayer/ghost/GPG_Application.cpp
source/gameengine/Ketsji/BL_Material.h
source/gameengine/Ketsji/BL_Shader.cpp
source/gameengine/Ketsji/BL_Shader.h
source/gameengine/Ketsji/BL_Texture.cpp
source/gameengine/Ketsji/KX_BlenderMaterial.cpp
source/gameengine/Ketsji/KX_BlenderMaterial.h
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.h
source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
source/gameengine/Ketsji/KX_PythonInit.cpp
source/gameengine/Ketsji/Makefile
source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp
source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp
source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
source/gameengine/Rasterizer/Makefile
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
source/nan_compile.mk
source/nan_definitions.mk

index 22ca6b68652440cb7d12e19c22db3e789dd70b9f..ce1a68518845120a64b8466ba77e2bdb9016bcac 100644 (file)
@@ -79,7 +79,7 @@ PYPLAYERLIB ?= $(PYLIB)
     GRPLIB = $(OCGDIR)/creator/$(DEBUG_DIR)libcreator.a
     GRPLIB += $(OCGDIR)/blender/src/$(DEBUG_DIR)libsrcpublisher.a
     GRPLIB += $(NAN_BSP)/lib/$(DEBUG_DIR)libbsp.a
-       GRPLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a
+    GRPLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a
     GRPLIB += $(NAN_SOUNDSYSTEM)/lib/$(DEBUG_DIR)libSoundSystem.a
     GRPLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
     GRPLIB += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
@@ -90,7 +90,6 @@ PYPLAYERLIB ?= $(PYLIB)
     GRPLIB += $(NAN_SUPERLU)/lib/$(DEBUG_DIR)libsuperlu.a      
     GRPLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a
 
-
 # nlin: the reason that some libraries appear more than once below is
 # to handle circular dependencies in linking among libraries... some
 # linkers (e.g. under Linux) need libs to be specified multiple times
@@ -118,7 +117,7 @@ ifneq ($(NAN_NO_KETSJI),true)
     COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a
     COMLIB += $(OCGDIR)/gameengine/blphys/fuzzics/$(DEBUG_DIR)libfuzzics.a
     COMLIB += $(NAN_QHULL)/lib/libqhull.a
-   COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
+    COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
     COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
 #    COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a
     COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
@@ -163,11 +162,11 @@ endif
   endif
   ifeq ($(WITH_FREETYPE2), true)
     ifeq ($(OS), windows)
-               ifeq ($(FREE_WINDOWS), true)
-                       COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
-               else
-                       COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
-               endif
+      ifeq ($(FREE_WINDOWS), true)
+        COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
+      else
+        COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
+      endif
     else
       ifeq ($(OS), irix)
         COMLIB += $(NAN_FREETYPE)/lib32/libfreetype.a
@@ -198,22 +197,22 @@ ifeq ($(INTERNATIONAL), true)
           COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
         endif
     endif
-       ifeq ($(OS), darwin)
-           COMLIB += $(NAN_GETTEXT)/lib/libintl.a
-       endif
-       ifeq ($(OS), solaris)
-           COMLIB += $(NAN_GETTEXT)/lib/libintl.a
-       endif
+    ifeq ($(OS), darwin)
+        COMLIB += $(NAN_GETTEXT)/lib/libintl.a
+    endif
+    ifeq ($(OS), solaris)
+        COMLIB += $(NAN_GETTEXT)/lib/libintl.a
+    endif
 endif
 
 ifeq ($(OS), irix)
-       COMLIB += $(NAN_SDL)/lib/libSDL.a
+    COMLIB += $(NAN_SDL)/lib/libSDL.a
 endif
 ifeq ($(OS), windows)
     ifeq ($(FREE_WINDOWS), true)
-           COMLIB += $(NAN_SDL)/lib/libSDL.a
+        COMLIB += $(NAN_SDL)/lib/libSDL.a
     else
-           COMLIB += $(NAN_SDL)/lib/SDL.lib
+        COMLIB += $(NAN_SDL)/lib/SDL.lib
     endif
 endif
 
@@ -279,7 +278,6 @@ ifeq ($(OS),$(findstring $(OS), "windows"))
 endif
     PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/$(DEBUG_DIR)libcommon.a
 
-
 ifeq ($(OS),$(findstring $(OS), "linux"))
   ifeq ($(CPU),i386)
     PLUGAPPLIB_XPLINK = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)_Blender3DPlugin_implementation_.o 
@@ -300,7 +298,6 @@ endif
 ifeq ($(OS),darwin)
     BINTARGETS = blenderdynamic.app
     BINTARGETS += blenderplayer.app
-
     ifdef PY_FRAMEWORK
         PYLIB = -framework Python
     else 
@@ -340,7 +337,7 @@ ifeq ($(OS),linux)
     BINTARGETS += blenderplayer
     BINTARGETS += blenderstatic
     ifneq ($(NAN_NO_PLUGIN),true)
-       BINTARGETS += plugin xplink
+      BINTARGETS += plugin xplink
     endif
   endif
   ifeq ($(CPU),powerpc)
@@ -366,14 +363,12 @@ ifeq ($(OS),solaris)
     PYLIB = $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
     PYLIB += $(NAN_MXTEXTTOOLS)
     PYLIB += $(NAN_ZLIB)/lib/libz.a
-
     PULIB += $(NAN_ZLIB)/lib/libz.a
     SPLIB += $(NAN_ZLIB)/lib/libz.a
 endif
 
 # OpenAL libs are already compiled as shared code! Check FMod if we switch to that. (nzc)
 
-
 # Some vars to keep the rest of this section mostly readable
 # in an 80 char term
 SOUNDSYSTEM = $(OCGDIR)/intern/SoundSystem/$(DEBUG_DIR)libSoundSystem.a
@@ -434,12 +429,12 @@ else
 endif
 
 ifeq ($(OS),windows)
-       ifeq ($(FREE_WINDOWS),true)
-               PYLIB = $(NAN_PYTHON)/lib/freepy.a
+    ifeq ($(FREE_WINDOWS),true)
+        PYLIB = $(NAN_PYTHON)/lib/freepy.a
     else
-               PYLIB = $(NAN_PYTHON)/lib/python23.lib
+        PYLIB = $(NAN_PYTHON)/lib/python23.lib
     endif
-    
+
     PYPLAYERLIB = $(NAN_PYTHON)/static/*.obj
     PYPLAYERLIB = $(PYLIB)
 
@@ -692,3 +687,4 @@ $(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT): $(NSPLUGLIB)
        /bin/rm $(BUILDINFO_O)
     endif
 endif
+
index 13fd55d244fed9c361536d700e43141ef4d2d2f9..84c92fef0af5657cc00538f03ba34e71e711f39a 100644 (file)
@@ -43,7 +43,7 @@ extern "C" {
 struct ListBase;
 struct MemFile;
 
-#define BLENDER_VERSION                240
+#define BLENDER_VERSION                241
 
 int    BKE_read_file(char *dir, void *type_r);
 int BKE_read_file_from_memory(char* filebuf, int filelength, void *type_r);
index 15116b390cc40aa696efe2f5822e30001d643738..f5d8edef1671180518e5ca3a32a15aa447078fbd 100644 (file)
@@ -809,7 +809,22 @@ void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[]
   pose_mat(b)= arm_mat(b) * chan_mat(b)
   
   *************************************************************************** */
+/*  Computes vector and roll based on a rotation. "mat" must
+     contain only a rotation, and no scaling. */ 
+void mat3_to_vec_roll(float mat[][3], float *vec, float *roll) {
+     if (vec)
+         VecCopyf(vec, mat[1]);
 
+     if (roll) {
+         float vecmat[3][3], vecmatinv[3][3], rollmat[3][3];
+
+         vec_roll_to_mat3(mat[1], 0.0f, vecmat);
+         Mat3Inv(vecmatinv, vecmat);
+         Mat3MulMat3(rollmat, vecmatinv, mat);
+
+         *roll= atan2(rollmat[2][0], rollmat[2][2]);
+     }
+}
 
 /*     Calculates the rest matrix of a bone based
        On its vector and a roll around that vector */
index db097b3733933e420fbc15b09acecba83f80a335..7458a0230ddeccbe5b2d1b2b96e875a33ad30173 100644 (file)
@@ -383,6 +383,9 @@ Object *get_constraint_target(bConstraint *con, char **subtarget)
                        return (data->tar);
                }
                break;
+       default:
+               *subtarget= NULL;
+               break;
        }
        
        return NULL;  
index 6c64a954b49235d2be99ee0e422740022e69707d..d0b741123b5991caefdf5b4123acb5991772beed 100644 (file)
@@ -275,7 +275,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispLis
        vmap= make_uv_vert_map(mface, tface, totface, totvert, 0, limit);
        if (!vmap)
                return 0;
-
+       
        ccgSubSurf_initFullSync(ss);
 
        /* use this to get consistent vert handles with different heap addresses */
@@ -283,6 +283,9 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispLis
 
        /* create vertices */
        for (i=0; i<totvert; i++) {
+               if (!get_uv_map_vert(vmap, i))
+                       continue;
+
                for (v=get_uv_map_vert(vmap, i)->next; v; v=v->next)
                        if (v->separate)
                                break;
index 3cdc0de4f5224efcada3dc77b2742f3a7e55cf61..529d428692b5dd01d5b445e1805e72abea2d9beb 100644 (file)
@@ -1706,8 +1706,9 @@ static PyObject *reimportText( PyObject *module )
 
        /* if previously compiled, free the object */
        /* (can't see how could be NULL, but check just in case) */ 
-       if( text->compiled )
+       if( text->compiled ){
                Py_DECREF( (PyObject *)text->compiled );
+       }
 
        /* compile the buffer */
        buf = txt_to_buf( text );
index c7a597c62c936f82a752e1c4bdd8b4c8f885910a..aedafd84e962a048b0a0c9a1f74a164a4c72a5e3 100644 (file)
@@ -43,6 +43,7 @@ source_files = ['BPY_interface.c',
                 'api2_2x/Types.c',
                 'api2_2x/Window.c',
                 'api2_2x/World.c',
+                'api2_2x/Pose.c',
                 'api2_2x/Image.c',
                 'api2_2x/Text.c',
                 'api2_2x/Text3d.c',
index 743956a1f61c9438f79282207b663d0727d8a60d..28ae3eadcc7ac04cb01e017bfb69b4eafb0442a8 100644 (file)
@@ -44,8 +44,7 @@
 #include "DNA_object_types.h" //This must come before BIF_editarmature.h...
 #include "BIF_editarmature.h"
 
-//------------------UNDECLARED EXTERNAL PROTOTYPES--------------------
-//These are evil 'extern' declarations for functions with no anywhere
+//------------------EXTERNAL PROTOTYPES--------------------
 extern void free_editArmature(void);
 extern void make_boneList(ListBase* list, ListBase *bones, EditBone *parent);
 extern void editbones_to_armature (ListBase *list, Object *ob);
@@ -112,7 +111,7 @@ static PyMethodDef BPy_BonesDict_methods[] = {
                "() - Returns the keys the dictionary"},
        {"values", (PyCFunction) BonesDict_values, METH_NOARGS, 
                "() - Returns the values from the dictionary"},
-       {NULL}
+       {NULL, NULL, 0, NULL}
 };
 //-----------------(internal)
 static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){
@@ -225,8 +224,18 @@ PyObject *BonesDict_GetItem(BPy_BonesDict *self, PyObject* key)
        }else{
                value = PyDict_GetItem(self->bonesMap, key);
        }
-       if(value == NULL){
-        return EXPP_incr_ret(Py_None);
+       if(value == NULL){  /* item not found in dict. throw exception */
+               char buffer[128];
+               char* key_str;
+               key_str = PyString_AsString( key );
+               if( !key_str ){  /* key not a py string */
+                       key_str = "";  /* use empty string for printing */
+               }
+  
+               PyOS_snprintf( buffer, sizeof(buffer),
+                                          "bone %s not found", key_str);
+                       
+        return EXPP_ReturnPyObjError(PyExc_KeyError, buffer );
        }
        return EXPP_incr_ret(value);
 }
@@ -335,7 +344,7 @@ AttributeError3:
        return EXPP_intError(PyExc_AttributeError, "%s%s", 
                sBoneDictBadArgs,  "The 'connected' flag is set but the bone has no parent!");
 }
-//------------------TYPE_OBECT DEFINITION--------------------------
+//------------------TYPE_OBJECT DEFINITION--------------------------
 //Mapping Protocol
 static PyMappingMethods BonesDict_MapMethods = {
        (inquiry) BonesDict_len,                                        //mp_length
@@ -929,7 +938,7 @@ static PyMethodDef BPy_Armature_methods[] = {
                "() - Unlocks the ability to modify armature bones"},
        {"update", (PyCFunction) Armature_update, METH_NOARGS, 
                "() - Rebuilds the armature based on changes to bones since the last call to makeEditable"},
-       {NULL}
+       {NULL, NULL, 0, NULL}
 };
 //------------------------tp_getset
 //This contains methods for attributes that require checking
@@ -1218,7 +1227,7 @@ static char M_Armature_Get_doc[] = "(name) - return the armature with the name '
 
 struct PyMethodDef M_Armature_methods[] = {
        {"Get", M_Armature_Get, METH_VARARGS, M_Armature_Get_doc},
-       {NULL}
+       {NULL, NULL, 0, NULL}
 };
 //------------------VISIBLE PROTOTYPE IMPLEMENTATION-----------------------
 //-----------------(internal)
index 4d14b41fdc8016695b93f1e13aa71de0720ff67e..dbf21d1e5a5aba92b64b0ce8dc5313916a8f67af 100644 (file)
@@ -40,8 +40,8 @@
 //-------------------MODULE INIT---------------------------------
 PyObject *Armature_Init( void );
 //-------------------TYPEOBJECT----------------------------------
-PyTypeObject Armature_Type;
-PyTypeObject BonesDict_Type;
+extern PyTypeObject Armature_Type;
+extern PyTypeObject BonesDict_Type;
 //-------------------STRUCT DEFINITION---------------------------
 typedef struct {
        PyObject_HEAD 
index 3d610e38fd6d2c4b81931c72d6543c6328beda0a..c8b82d16a88f483f7cd996ed845bbebb9069f222 100644 (file)
@@ -256,39 +256,20 @@ static PyObject *BezTriple_getTriple( BPy_BezTriple * self )
 
 static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args )
 {
-
        int i;
        struct BezTriple *bezt = self->beztriple;
        PyObject *popo = 0;
 
-       if( !PyArg_ParseTuple( args, "O", &popo ) )
-               return ( EXPP_ReturnPyObjError
-                        ( PyExc_TypeError, "expected sequence argument" ) );
-
-       if( PySequence_Check( popo ) == 0 ) {
-               puts( "error in BezTriple_setPoints - expected sequence" );
-               Py_INCREF( Py_None );
-               return Py_None;
-       }
-
-       {
-               /*
-                  some debug stuff 
-                  this will become an overloaded args check
-                */
-               int size = PySequence_Size( popo );
-               printf( "\n dbg: sequence size is %d\n", size );
-       }
+       if( !PyArg_ParseTuple( args, "O", &popo ) || !PySequence_Check( popo ) )
+               return EXPP_ReturnPyObjError( PyExc_TypeError,
+                               "expected sequence argument" );
 
        for( i = 0; i < 2; i++ ) {
-               PyObject *o = PySequence_GetItem( popo, i );
-               if( !o )
-                       printf( "\n bad o. o no!\n" );
-
-               /*   bezt->vec[1][i] = PyFloat_AsDouble (PyTuple_GetItem (popo, i)); */
+               PyObject *o = PySequence_ITEM( popo, i );
                bezt->vec[1][i] = (float)PyFloat_AsDouble( o );
                bezt->vec[0][i] = bezt->vec[1][i] - 1;
                bezt->vec[2][i] = bezt->vec[1][i] + 1;
+               Py_DECREF( o );
        }
 
        /* experimental fussing with handles - ipo.c: calchandles_ipocurve */
@@ -298,8 +279,7 @@ static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args )
        if( bezt->vec[2][0] < bezt->vec[1][0] )
                bezt->vec[2][0] = bezt->vec[1][0];
 
-       Py_INCREF( Py_None );
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 
index b4f8af4fe12ea5c5d311fa0ebbdac88f3d0ce143..7e233e5f647e9585ee802ff09f6bde99d2053cae 100644 (file)
 #include "DNA_object_types.h" //1
 #include "BIF_editarmature.h"   //2
 
+//------------------UNDECLARED EXTERNAL PROTOTYPES--------------------
+extern void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
+
 //------------------------ERROR CODES---------------------------------
 //This is here just to make me happy and to have more consistant error strings :)
-static const char sEditBoneError[] = "EditBone (internal) - Error: ";
-static const char sEditBoneBadArgs[] = "EditBone (internal) - Bad Arguments: ";
+static const char sEditBoneError[] = "EditBone - Error: ";
+static const char sEditBoneBadArgs[] = "EditBone - Bad Arguments: ";
 static const char sBoneError[] = "Bone - Error: ";
 static const char sBoneBadArgs[] = "Bone - Bad Arguments: ";
-static const char sConstListError[] = "ConstantList - Error: ";
-static const char sConstListBadArgs[] = "ConstantList - Bad Arguments: ";
 
 //----------------------(internal)
 //gets the bone->roll (which is a localspace roll) and puts it in parentspace
@@ -541,7 +542,6 @@ static int EditBone_setParent(BPy_EditBone *self, PyObject *value, void *closure
 AttributeError:
        return EXPP_intError(PyExc_AttributeError, "%s%s%s",
                sEditBoneError, ".parent: ", "expects a EditBone Object");
-
 AttributeError2:
        return EXPP_intError(PyExc_AttributeError, "%s%s%s",
                sEditBoneError, ".parent: ", "This object is not in the armature's bone list!");
@@ -565,8 +565,53 @@ static PyObject *EditBone_getMatrix(BPy_EditBone *self, void *closure)
 //------------------------EditBone.matrix (set)
 static int EditBone_setMatrix(BPy_EditBone *self, PyObject *value, void *closure)
 {  
-       printf("Sorry this isn't implemented yet.... :/");
-       return 1;
+       PyObject *matrix;
+       float roll, length, vec[3], axis[3], mat3[3][3];
+
+       if (!PyArg_Parse(value, "O!", &matrix_Type, &matrix))
+               goto AttributeError;
+
+       //make sure we have the right sizes
+       if (((MatrixObject*)matrix)->rowSize != 3 && ((MatrixObject*)matrix)->colSize != 3){
+               if(((MatrixObject*)matrix)->rowSize != 4 && ((MatrixObject*)matrix)->colSize != 4){
+                       goto AttributeError;
+               }
+       }
+               
+       /*vec will be a normalized directional vector
+       * together with the length of the old bone vec*length = the new vector*/
+       /*The default rotation is 0,1,0 on the Y axis (see mat3_to_vec_roll)*/
+       if (((MatrixObject*)matrix)->rowSize == 4){
+               Mat3CpyMat4(mat3, ((float (*)[4])*((MatrixObject*)matrix)->matrix));
+       }else{
+               Mat3CpyMat3(mat3, ((float (*)[3])*((MatrixObject*)matrix)->matrix));
+       }
+       mat3_to_vec_roll(mat3, vec, &roll);
+
+       //if a 4x4 matrix was passed we'll translate the vector otherwise not
+       if (self->editbone){
+               self->editbone->roll = roll;
+               VecSubf(axis, self->editbone->tail, self->editbone->head);
+               length =  VecLength(axis);
+               VecMulf(vec, length);
+               if (((MatrixObject*)matrix)->rowSize == 4)
+                       VecCopyf(self->editbone->head, ((MatrixObject*)matrix)->matrix[3]);
+               VecAddf(self->editbone->tail, self->editbone->head, vec);
+               return 0;
+       }else{
+               self->roll = roll;
+               VecSubf(axis, self->tail, self->head);
+               length =  VecLength(axis);
+               VecMulf(vec, length);
+               if (((MatrixObject*)matrix)->rowSize == 4)
+                       VecCopyf(self->head, ((MatrixObject*)matrix)->matrix[3]);
+               VecAddf(self->tail, self->head, vec);
+               return 0;
+       }
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sEditBoneError, ".matrix: ", "expects a 3x3 or 4x4 Matrix Object");
 }
 //------------------------Bone.length (get)
 static PyObject *EditBone_getLength(BPy_EditBone *self, void *closure)
@@ -603,7 +648,7 @@ static PyMethodDef BPy_EditBone_methods[] = {
                "() - True/False - Bone has a parent"},
        {"clearParent", (PyCFunction) EditBone_clearParent, METH_NOARGS, 
                "() - sets the parent to None"},
-       {NULL}
+       {NULL, NULL, 0, NULL}
 };
 ///------------------------tp_getset
 //This contains methods for attributes that require checking
@@ -630,7 +675,7 @@ static PyGetSetDef BPy_EditBone_getset[] = {
                "The parent bone of this bone", NULL},
        {"length", (getter)EditBone_getLength, (setter)EditBone_setLength, 
                "The length of this bone", NULL},
-       {NULL}
+       {NULL, NULL, NULL, NULL,NULL}
 };
 
 //------------------------tp_repr
@@ -751,6 +796,28 @@ PyTypeObject EditBone_Type = {
 };
 
 //------------------METHOD IMPLEMENTATIONS--------------------------------
+//------------------------(internal) PyBone_ChildrenAsList
+static int PyBone_ChildrenAsList(PyObject *list, ListBase *bones){
+       Bone *bone = NULL;
+       PyObject *py_bone = NULL;
+
+       for (bone = bones->first; bone; bone = bone->next){
+               py_bone = PyBone_FromBone(bone);
+               if (py_bone == NULL)
+                       return 0;
+
+               if(PyList_Append(list, py_bone) == -1){
+                       goto RuntimeError;
+               }
+               if (bone->childbase.first) 
+                       PyBone_ChildrenAsList(list, &bone->childbase);
+       }
+       return 1;
+
+RuntimeError:
+       return EXPP_intError(PyExc_RuntimeError, "%s%s", 
+               sBoneError, "Internal error trying to wrap blender bones!");
+}
 //-------------------------Bone.hasParent()
 PyObject *Bone_hasParent(BPy_Bone *self)
 {
@@ -767,6 +834,20 @@ PyObject *Bone_hasChildren(BPy_Bone *self)
        else
                return EXPP_incr_ret(Py_False);
 }
+//-------------------------Bone.getAllChildren()
+PyObject *Bone_getAllChildren(BPy_Bone *self)
+{
+       PyObject *list = NULL;
+
+       if (self->bone->childbase.first){
+               list = PyList_New(0);
+               if (!PyBone_ChildrenAsList(list, &self->bone->childbase))
+                       return NULL;
+               return EXPP_incr_ret(list);
+       }else{
+               return EXPP_incr_ret(Py_None);
+       }
+}
 //------------------ATTRIBUTE IMPLEMENTATIONS-----------------------------
 //------------------------Bone.name (get)
 static PyObject *Bone_getName(BPy_Bone *self, void *closure)
@@ -920,42 +1001,31 @@ static int Bone_setParent(BPy_Bone *self, PyObject *value, void *closure)
   return EXPP_intError(PyExc_ValueError, "%s%s", 
                sBoneError, "You must first call .makeEditable() to edit the armature");
 }
-//------------------------(internal) PyBone_ChildrenAsList
-static int PyBone_ChildrenAsList(PyObject *list, ListBase *bones){
-       Bone *bone = NULL;
-       PyObject *py_bone = NULL;
-
-       for (bone = bones->first; bone; bone = bone->next){
-               py_bone = PyBone_FromBone(bone);
-               if (py_bone == NULL)
-                       return 0;
-
-               if(PyList_Append(list, py_bone) == -1){
-                       goto RuntimeError;
-               }
-               if (bone->childbase.first) 
-                       PyBone_ChildrenAsList(list, &bone->childbase);
-       }
-       return 1;
-
-RuntimeError:
-       return EXPP_intError(PyExc_RuntimeError, "%s%s", 
-               sBoneError, "Internal error trying to wrap blender bones!");
-}
-
 //------------------------Bone.children (get)
 static PyObject *Bone_getChildren(BPy_Bone *self, void *closure)
 {
        PyObject *list = NULL;
+       Bone *bone = NULL;
+       PyObject *py_bone = NULL;
 
        if (self->bone->childbase.first){
                list = PyList_New(0);
-               if (!PyBone_ChildrenAsList(list, &self->bone->childbase))
-                       return NULL;
+               for (bone = self->bone->childbase.first; bone; bone = bone->next){
+                       py_bone = PyBone_FromBone(bone);
+                       if (py_bone == NULL)
+                               return 0;
+                       if(PyList_Append(list, py_bone) == -1){
+                               goto RuntimeError;
+                       }
+               }
                return EXPP_incr_ret(list);
        }else{
                return EXPP_incr_ret(Py_None);
        }
+
+RuntimeError:
+       return EXPP_objError(PyExc_RuntimeError, "%s%s", 
+               sBoneError, "Internal error trying to wrap blender bones!");
 }
 //------------------------Bone.children (set)
 static int Bone_setChildren(BPy_Bone *self, PyObject *value, void *closure)
@@ -995,7 +1065,9 @@ static PyMethodDef BPy_Bone_methods[] = {
                "() - True/False - Bone has a parent"},
        {"hasChildren", (PyCFunction) Bone_hasChildren, METH_NOARGS, 
                "() - True/False - Bone has 1 or more children"},
-       {NULL}
+       {"getAllChildren", (PyCFunction) Bone_getAllChildren, METH_NOARGS, 
+               "() - All the children for this bone - including children's children"},
+       {NULL, NULL, 0, NULL}
 };
 //------------------------tp_getset
 //This contains methods for attributes that require checking
@@ -1024,7 +1096,7 @@ static PyGetSetDef BPy_Bone_getset[] = {
                "The child bones of this bone", NULL},
        {"length", (getter)Bone_getLength, (setter)Bone_setLength, 
                "The length of this bone", NULL},
-       {NULL}
+       {NULL, NULL, NULL, NULL,NULL}
 };
 //------------------------tp_repr
 //This is the string representation of the object
index aa095733d05be970fc4cab4ac6afc328527071f4..8c10aeb307525aa7256b73a882c052c36a7457ef 100644 (file)
@@ -38,8 +38,8 @@
 #define BoneObject_Check(v) ((v)->ob_type == &Bone_Type)
 #define EditBoneObject_Check(v) ((v)->ob_type == &EditBone_Type)
 //-------------------TYPEOBJECT----------------------------------
-PyTypeObject EditBone_Type;
-PyTypeObject Bone_Type;
+extern PyTypeObject EditBone_Type;
+extern PyTypeObject Bone_Type;
 //-------------------STRUCT DEFINITION----------------------------
 
 typedef struct {
index e71602ad6b41f8839c4589496c7c50c8a0b8bb1d..32d7bc26191cfdad371a56eba77a3f5a61bf971a 100644 (file)
@@ -25,7 +25,8 @@
  *
  * This is a new part of Blender.
  *
- * Contributor(s): Pontus Lidman, Johnny Matthews, Ken Hughes
+ * Contributor(s): Pontus Lidman, Johnny Matthews, Ken Hughes,
+ *   Michael Reimpell
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
  */
@@ -36,6 +37,7 @@
 #include <BKE_global.h>
 #include <BKE_main.h>
 #include <BKE_curve.h>
+#include "BIF_space.h"
 
 #include "Ipocurve.h"
 #include "Key.h"
@@ -62,10 +64,12 @@ static void KeyBlock_dealloc( PyObject * self );
 static PyObject *Key_repr( BPy_Key * self );
 
 static PyObject *Key_getBlocks( PyObject * self );
-static PyObject *Key_getType( PyObject * self );
+static PyObject *Key_getType( BPy_Key * self );
+static PyObject *Key_getRelative( BPy_Key * self );
 static PyObject *Key_getIpo( PyObject * self );
 static int Key_setIpo( PyObject * self, PyObject * args );
 static PyObject *Key_getValue( PyObject * self );
+static int Key_setRelative( BPy_Key * self, PyObject * value );
 
 static struct PyMethodDef Key_methods[] = {
        { "getBlocks", (PyCFunction) Key_getBlocks, METH_NOARGS, "Get key blocks" },
@@ -74,21 +78,21 @@ static struct PyMethodDef Key_methods[] = {
 };
 
 static PyGetSetDef BPy_Key_getsetters[] = {
-               {"type",(getter)Key_getType, (setter)NULL,
-                "Key Type",NULL},
-               {"value",(getter)Key_getValue, (setter)NULL,
-                "Key value",NULL},
-               {"ipo",(getter)Key_getIpo, (setter)Key_setIpo,
-                "ipo linked to key",NULL},
-               {"blocks",(getter)Key_getBlocks, (setter)NULL,
-                "blocks linked to the key",NULL},
-               {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
-       };
-
-
+       {"type",(getter)Key_getType, (setter)NULL,
+        "Key Type",NULL},
+       {"value",(getter)Key_getValue, (setter)NULL,
+        "Key value",NULL},
+       {"ipo",(getter)Key_getIpo, (setter)Key_setIpo,
+        "Ipo linked to key",NULL},
+       {"blocks",(getter)Key_getBlocks, (setter)NULL,
+        "Blocks linked to the key",NULL},
+       {"relative",(getter)Key_getRelative, (setter)Key_setRelative,
+        "Non-zero is key is relative",NULL},
+       {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
+};
 
 static PyObject *KeyBlock_getData( PyObject * self );
-
+static PyObject *KeyBlock_getCurval( BPy_KeyBlock * self );
 static PyObject *KeyBlock_getName( BPy_KeyBlock * self );
 static PyObject *KeyBlock_getPos( BPy_KeyBlock * self );
 static PyObject *KeyBlock_getSlidermin( BPy_KeyBlock * self );
@@ -107,6 +111,8 @@ static struct PyMethodDef KeyBlock_methods[] = {
 };
 
 static PyGetSetDef BPy_KeyBlock_getsetters[] = {
+               {"curval",(getter)KeyBlock_getCurval, (setter)NULL,
+                "Current value of the corresponding IpoCurve",NULL},
                {"name",(getter)KeyBlock_getName, (setter)KeyBlock_setName,
                 "Keyblock Name",NULL},
                {"pos",(getter)KeyBlock_getPos, (setter)NULL,
@@ -362,13 +368,32 @@ static int Key_setIpo( PyObject * self, PyObject * value )
        return 0;
 }
 
-static PyObject *Key_getType( PyObject * self )
+static PyObject *Key_getRelative( BPy_Key * self )
+{
+       if( self->key->type == KEY_RELATIVE )
+               return EXPP_incr_ret(Py_True);
+       else
+               return EXPP_incr_ret(Py_False);
+}
+
+static int Key_setRelative( BPy_Key * self, PyObject * value )
+{
+       if( PyObject_IsTrue( value ) )
+               self->key->type = KEY_RELATIVE;
+       else
+               self->key->type = KEY_NORMAL;
+       allqueue(REDRAWIPO, 0);
+       allspace(REMAKEIPO, 0);
+
+       return 0;
+}
+
+static PyObject *Key_getType( BPy_Key * self )
 {
-       BPy_Key *k = ( BPy_Key * ) self;
        int idcode;
        int type = -1;
 
-       idcode = GS( k->key->from->name );
+       idcode = GS( self->key->from->name );
 
        switch( idcode ) {
        case ID_ME:
@@ -437,55 +462,51 @@ PyObject *KeyBlock_CreatePyObject( KeyBlock * kb, Key *parentKey )
        return ( PyObject * ) keyBlock;
 }
 
+static PyObject *KeyBlock_getCurval( BPy_KeyBlock * self ) {
+       return PyFloat_FromDouble( self->keyblock->curval );
+}
+
 static PyObject *KeyBlock_getName( BPy_KeyBlock * self ) {
-       BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;
-       PyObject *name = Py_BuildValue( "s", kb->keyblock->name);
+       PyObject *name = Py_BuildValue( "s", self->keyblock->name);
        return name;
 }
 
 static PyObject *KeyBlock_getPos( BPy_KeyBlock * self ){
-       BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;
-       return PyFloat_FromDouble( kb->keyblock->pos );                 
+       return PyFloat_FromDouble( self->keyblock->pos );                       
 }
 
 static PyObject *KeyBlock_getSlidermin( BPy_KeyBlock * self ){
-       BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;
-       return PyFloat_FromDouble( kb->keyblock->slidermin );   
+       return PyFloat_FromDouble( self->keyblock->slidermin ); 
 }
 
 static PyObject *KeyBlock_getSlidermax( BPy_KeyBlock * self ){
-       BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;
-       return PyFloat_FromDouble( kb->keyblock->slidermax );
+       return PyFloat_FromDouble( self->keyblock->slidermax );
 }
 
 static PyObject *KeyBlock_getVgroup( BPy_KeyBlock * self ){
-       BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;
-       PyObject *name = Py_BuildValue( "s", kb->keyblock->vgroup);
-       return name;    
+       return Py_BuildValue( "s", self->keyblock->vgroup);
 }
 
 static int KeyBlock_setName( BPy_KeyBlock * self, PyObject * args ){
        char* text = NULL;
-    BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;        
-    
        text = PyString_AsString ( args );
        if( !text )
                return EXPP_ReturnIntError( PyExc_TypeError,
                                              "expected string argument" );                                                     
-       strncpy( kb->keyblock->name, text , 32);
+       strncpy( self->keyblock->name, text , 32);
 
        return 0;       
 }
 
 static int KeyBlock_setVgroup( BPy_KeyBlock * self, PyObject * args  ){
        char* text = NULL;
-    BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self;        
-    
+
        text = PyString_AsString ( args );
        if( !text )
                return EXPP_ReturnIntError( PyExc_TypeError,
                                              "expected string argument" );                                                     
-       strncpy( kb->keyblock->vgroup, text , 32);
+       strncpy( self->keyblock->vgroup, text , 32);
 
        return 0;       
 }
@@ -635,7 +656,8 @@ static PyObject *M_Key_Get( PyObject * self, PyObject * args )
                        "expected string argument (or nothing)" ) );
 
        if ( name ) {
-               for (key_iter = G.main->key.first; key_iter; key_iter=key_iter->id.next) {
+               for (key_iter = G.main->key.first; key_iter; 
+                               key_iter=key_iter->id.next) {
                        if  (strcmp ( key_iter->id.name + 2, name ) == 0 ) {
                                return Key_CreatePyObject( key_iter );
                        }
@@ -643,17 +665,16 @@ static PyObject *M_Key_Get( PyObject * self, PyObject * args )
 
                PyOS_snprintf( error_msg, sizeof( error_msg ),
                        "Key \"%s\" not found", name );
-               return ( EXPP_ReturnPyObjError ( PyExc_NameError, error_msg ) );
+               return EXPP_ReturnPyObjError ( PyExc_NameError, error_msg );
                
-       }
-
-       else {
+       } else {
 
                PyObject *keylist;
 
                keylist = PyList_New( BLI_countlist( &( G.main->key ) ) );
 
-               for ( i=0, key_iter = G.main->key.first; key_iter; key_iter=key_iter->id.next, i++ ) {
+               for ( i=0, key_iter = G.main->key.first; key_iter;
+                               key_iter=key_iter->id.next, i++ ) {
                        PyList_SetItem(keylist, i, Key_CreatePyObject(key_iter));
                }
                return keylist;
@@ -665,32 +686,36 @@ struct PyMethodDef M_Key_methods[] = {
        {NULL, NULL, 0, NULL}
 };
 
+static PyObject *M_Key_TypesDict( void )
+{
+       PyObject *T = PyConstant_New(  );
+
+       if( T ) {
+               BPy_constant *d = ( BPy_constant * ) T;
+
+               PyConstant_Insert( d, "MESH", PyInt_FromLong( KEY_TYPE_MESH ) );
+               PyConstant_Insert( d, "CURVE", PyInt_FromLong( KEY_TYPE_CURVE ) );
+               PyConstant_Insert( d, "LATTICE", PyInt_FromLong( KEY_TYPE_LATTICE ) );
+       }
+
+       return T;
+}
+
 PyObject *Key_Init( void )
 {
-       PyObject *submodule, *KeyTypes;
+       PyObject *submodule;
+       PyObject *Types = NULL;
 
-       if( PyType_Ready( &Key_Type ) < 0)
+       if( PyType_Ready( &Key_Type ) < 0 || PyType_Ready( &KeyBlock_Type ) < 0 )
                return NULL;
 
-       Key_Type.ob_type = &PyType_Type;
-       PyType_Ready( &KeyBlock_Type );
-
        submodule =
                Py_InitModule3( "Blender.Key", M_Key_methods, "Key module" );
 
-       KeyTypes = PyConstant_New( );
-
-       PyConstant_Insert(( BPy_constant * ) KeyTypes, "MESH", PyInt_FromLong(KEY_TYPE_MESH));
-       PyConstant_Insert(( BPy_constant * ) KeyTypes, "CURVE", PyInt_FromLong(KEY_TYPE_CURVE));
-       PyConstant_Insert(( BPy_constant * ) KeyTypes, "LATTICE", PyInt_FromLong(KEY_TYPE_LATTICE));
-
-       PyModule_AddObject( submodule, "Types", KeyTypes);
+       Types = M_Key_TypesDict(  );
+       if( Types )
+               PyModule_AddObject( submodule, "Types", Types );
 
-       /*
-       PyModule_AddIntConstant( submodule, "TYPE_MESH",    KEY_TYPE_MESH );
-       PyModule_AddIntConstant( submodule, "TYPE_CURVE",   KEY_TYPE_CURVE );
-       PyModule_AddIntConstant( submodule, "TYPE_LATTICE", KEY_TYPE_LATTICE );
-       */
        return submodule;
 }
 
index 0bb882a046cc56215330e6aeb64df462afe28c75..91b86947a83ef0f020ee45a007f17dd123ba25f8 100644 (file)
@@ -82,8 +82,6 @@
 #include "constant.h"
 #include "gen_utils.h"
 
-#define MESH_TOOLS                     /* add access to mesh tools */
-
 /* EXPP Mesh defines */
 
 #define MESH_SMOOTHRESH               30
@@ -126,6 +124,7 @@ typedef struct SrchEdges {
 
 typedef struct SrchFaces {
        unsigned int v[4];              /* indices for verts */
+       unsigned int index;             /* index in original param list of this edge */
        unsigned char order;    /* order of original verts, bitpacked */
 } SrchFaces;
 
@@ -155,6 +154,22 @@ int medge_comp( const void *va, const void *vb )
        else return (a[1] > b[1]);
 }
 
+/*
+ * compare edges by insert list indices
+ */
+
+int medge_index_comp( const void *va, const void *vb )
+{
+       const SrchEdges *a = (SrchEdges *)va;
+       const SrchEdges *b = (SrchEdges *)vb;
+
+       /* compare list indices for differences */
+
+       if (a->index < b->index) return -1;
+       else return (a->index > b->index);
+}
+
+
 /*
  * compare faces by vertex indices
  */
@@ -190,6 +205,23 @@ int mface_comp( const void *va, const void *vb )
        return 0;
 }
 
+/*
+ * compare faces by insert list indices
+ */
+
+int mface_index_comp( const void *va, const void *vb )
+{
+       const SrchFaces *a = va;
+       const SrchFaces *b = vb;
+
+       /* compare indices, first to last, for differences */
+       if( a->index < b->index )
+               return -1;      
+       if( a->index > b->index )
+               return 1;
+       return 0;
+}
+
 /*
  * compare edges by vertex indices
  */
@@ -1386,7 +1418,7 @@ static PyObject *MVertSeq_item( BPy_MVertSeq * self, int i )
                                              "array index out of range" );
 
        return MVert_CreatePyObject( self->mesh, i );
-};
+}
 
 /*
  * retrieve a slice of the vertex list (as a Python list)
@@ -1453,7 +1485,7 @@ static int MVertSeq_assign_item( BPy_MVertSeq * self, int i,
        memcpy( dst, src, sizeof(MVert) );
        // mesh_update( self->mesh );
        return 0;
-};
+}
 
 static int MVertSeq_assign_slice( BPy_MVertSeq *self, int low, int high,
                   PyObject *args )
@@ -1566,39 +1598,42 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
        Mesh *mesh = self->mesh;
        /* make sure we get a sequence of tuples of something */
 
-       switch( PySequence_Size ( args ) ) {
+       switch( PySequence_Size( args ) ) {
        case 1:         /* better be a list or a tuple */
                tmp = PyTuple_GET_ITEM( args, 0 );
                if( !VectorObject_Check ( tmp ) ) {
                        if( !PySequence_Check ( tmp ) )
                                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                               "expected a sequence of tuple triplets" );
+                                               "expected a sequence of sequence triplets" );
                        args = tmp;
                }
                Py_INCREF( args );              /* so we can safely DECREF later */
                break;
-       case 3:         /* take any three args and put into a tuple */
+       case 3:
                tmp = PyTuple_GET_ITEM( args, 0 );
-               if( PyTuple_Check( tmp ) ) {
-                       Py_INCREF( args );
-                       break;
-               }
+               /* if first item is not a number, it's wrong */
+               if( !PyNumber_Check( tmp ) )
+                       return EXPP_ReturnPyObjError( PyExc_TypeError,
+                                       "expected a sequence of sequence triplets" );
+
+               /* otherwise, put into a new tuple */
                args = Py_BuildValue( "((OOO))", tmp,
                                PyTuple_GET_ITEM( args, 1 ), PyTuple_GET_ITEM( args, 2 ) );
                if( !args )
                        return EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                        "Py_BuildValue() failed" );
                break;
+
        default:        /* anything else is definitely wrong */
                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                               "expected a sequence of tuple triplets" );
+                               "expected a sequence of sequence triplets" );
        }
 
+       /* if no verts given, return quietly */
        len = PySequence_Size( args );
        if( len == 0 ) {
                Py_DECREF ( args );
-               return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected at least one tuple" );
+               Py_RETURN_NONE;
        }
 
        newlen = mesh->totvert + len;
@@ -1620,18 +1655,19 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
                        }
                        for( j = 0; j < 3; ++j )
                                co[j] = ((VectorObject *)tmp)->vec[j];
-               } else if( PyTuple_Check( tmp ) ) {
+               } else if( PySequence_Check( tmp ) ) {
                        int ok=1;
                        PyObject *flt;
-                       if( PyTuple_Size( tmp ) != 3 )
+                       if( PySequence_Size( tmp ) != 3 )
                                ok = 0;
                        else    
                                for( j = 0; ok && j < 3; ++j ) {
-                                       flt = PyTuple_GET_ITEM( tmp, j );
+                                       flt = PySequence_ITEM( tmp, j );
                                        if( !PyNumber_Check ( flt ) )
                                                ok = 0;
                                        else
                                                co[j] = (float)PyFloat_AsDouble( flt );
+                                       Py_DECREF( flt );
                                }
 
                        if( !ok ) {
@@ -1639,9 +1675,16 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
                                Py_DECREF ( args );
                                Py_DECREF ( tmp );
                                return EXPP_ReturnPyObjError( PyExc_ValueError,
-                                       "expected tuple triplet of floats" );
+                                       "expected sequence triplet of floats" );
                        }
+               } else {
+                       MEM_freeN( newvert );
+                       Py_DECREF ( args );
+                       Py_DECREF ( tmp );
+                       return EXPP_ReturnPyObjError( PyExc_ValueError,
+                               "expected sequence triplet of floats" );
                }
+
                Py_DECREF ( tmp );
 
        /* add the coordinate to the new list */
@@ -1714,7 +1757,7 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
        mesh_update( mesh );
 
        Py_DECREF ( args );
-       return EXPP_incr_ret( Py_None );
+       Py_RETURN_NONE;
 }
 
 static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
@@ -1725,15 +1768,20 @@ static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
        Mesh *mesh = self->mesh;
        MFace *tmpface;
 
-       Py_INCREF( args );              /* so we can safely DECREF later */
-
-       /* accept a sequence (lists or tuples) also */
+       /*
+        * if input tuple contains a single sequence, use it as input instead;
+        * otherwise use the sequence as-is and check later that it contains
+        * one or more integers or MVerts
+        */
        if( PySequence_Size( args ) == 1 ) {
                PyObject *tmp = PyTuple_GET_ITEM( args, 0 );
-               if( PySequence_Check ( tmp ) ) {
-                       Py_DECREF( args );              /* release previous reference */
-                       args = tmp;                             /* PyTuple_GET_ITEM returns new ref */
-               }
+               if( PySequence_Check( tmp ) ) 
+                       args = tmp;
+       }
+
+       /* if sequence is empty, do nothing */
+       if( PySequence_Size( args ) == 0 ) {
+               Py_RETURN_NONE;
        }
 
        /* allocate vertex lookup table */
@@ -1747,18 +1795,15 @@ static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
                if( BPy_MVert_Check( tmp ) ) {
                        if( (void *)self->mesh != ((BPy_MVert*)tmp)->data ) {
                                MEM_freeN( vert_table );
-                               Py_DECREF( args );
                                Py_DECREF( tmp );
                                return EXPP_ReturnPyObjError( PyExc_ValueError,
                                                "MVert belongs to a different mesh" );
                        }
                        index = ((BPy_MVert*)tmp)->index;
-               }
-               else if( PyInt_CheckExact( tmp ) )
+               } else if( PyInt_CheckExact( tmp ) ) {
                        index = PyInt_AsLong ( tmp );
-               else {
+               else {
                        MEM_freeN( vert_table );
-                       Py_DECREF( args );
                        Py_DECREF( tmp );
                        return EXPP_ReturnPyObjError( PyExc_TypeError,
                                        "expected a sequence of ints or MVerts" );
@@ -1766,8 +1811,7 @@ static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
                Py_DECREF( tmp );
                if( index < 0 || index >= mesh->totvert ) {
                        MEM_freeN( vert_table );
-                       Py_DECREF( args );
-                       return EXPP_ReturnPyObjError( PyExc_ValueError,
+                       return EXPP_ReturnPyObjError( PyExc_IndexError,
                                        "array index out of range" );
                }
                vert_table[index] = UINT_MAX;
@@ -1802,8 +1846,7 @@ static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
        /* clean up and exit */
        MEM_freeN( vert_table );
        mesh_update ( mesh );
-       Py_DECREF( args );
-       return EXPP_incr_ret( Py_None );
+       Py_RETURN_NONE;
 }
 
 static PyObject *MVertSeq_selected( BPy_MVertSeq * self )
@@ -2413,40 +2456,52 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
        MEdge *tmpedge;
        Mesh *mesh = self->mesh;
 
-       /* make sure we get a sequence of tuples of something */
-
-       switch( PySequence_Size ( args ) ) {
-       case 1:         /* better be a list or a tuple */
-               args = PyTuple_GET_ITEM( args, 0 );
-               if( !PySequence_Check ( args ) )
+       /* make sure we get a tuple of sequences of something */
+       switch( PySequence_Size( args ) ) {
+       case 1:
+               /* if a sequence... */
+               tmp = PyTuple_GET_ITEM( args, 0 );
+               if( PySequence_Check( tmp ) ) {
+                       /* if another sequence, use it */
+                       PyObject *tmp2 = PySequence_ITEM( tmp, 0 );
+                       if( PySequence_Check( tmp2 ) )
+                               args = tmp;
+                       Py_INCREF( args );
+                       Py_DECREF( tmp2 );
+               } else
                        return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                       "expected a sequence of tuple pairs" );
-               Py_INCREF( args );              /* so we can safely DECREF later */
+                                       "expected a sequence of sequence pairs" );
                break;
        case 2: 
        case 3:
        case 4:         /* two to four args may be individual verts */
                tmp = PyTuple_GET_ITEM( args, 0 );
-               if( PyTuple_Check( tmp ) ) {/* maybe just tuples, so use args as-is */
+               /*
+                * if first item isn't a sequence, then assume it's a bunch of MVerts
+                * and wrap inside a tuple
+                */
+               if( !PySequence_Check( tmp ) ) {
+                       args = Py_BuildValue( "(O)", args );
+                       if( !args )
+                               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                                               "Py_BuildValue() failed" );
+               /*
+                * otherwise, assume it already a bunch of sequences so use as-is
+                */
+               } else { 
                        Py_INCREF( args );              /* so we can safely DECREF later */
-                       break;
                }
-               args = Py_BuildValue( "(O)", args );
-               if( !args )
-                       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "Py_BuildValue() failed" );
                break;
        default:        /* anything else is definitely wrong */
                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                               "expected a sequence of tuple pairs" );
+                               "expected a sequence of sequence pairs" );
        }
 
        /* make sure there is something to add */
        len = PySequence_Size( args );
        if( len == 0 ) {
-               Py_DECREF( args );
-               return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected at least one tuple" );
+               Py_DECREF ( args );
+               Py_RETURN_NONE;
        }
 
        /* verify the param list and get a total count of number of edges */
@@ -2455,21 +2510,21 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                tmp = PySequence_GetItem( args, i );
 
                /* not a tuple of MVerts... error */
-               if( !PyTuple_Check( tmp ) ||
+               if( !PySequence_Check( tmp ) ||
                                EXPP_check_sequence_consistency( tmp, &MVert_Type ) != 1 ) {
                        Py_DECREF( tmp );
                        Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected sequence of MVert tuples" );
+                               "expected sequence of MVert sequences" );
                }
 
                /* not the right number of MVerts... error */
-               nverts = PyTuple_Size( tmp );
+               nverts = PySequence_Size( tmp );
                if( nverts < 2 || nverts > 4 ) {
                        Py_DECREF( tmp );
                        Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected 2 to 4 MVerts per tuple" );
+                               "expected 2 to 4 MVerts per sequence" );
                }
                Py_DECREF( tmp );
 
@@ -2486,14 +2541,15 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
        /* scan the input list and build the new edge pair list */
        len = PySequence_Size( args );
        tmppair = newpair;
+       new_edge_count = 0;
        for( i = 0; i < len; ++i ) {
                int edge_count;
                tmp = PySequence_GetItem( args, i );
-               nverts = PyTuple_Size( tmp );
+               nverts = PySequence_Size( tmp );
 
-               /* get copies of vertices */
+               /* get new references for the vertices */
                for(j = 0; j < nverts; ++j )
-                       e[j] = (BPy_MVert *)PyTuple_GET_ITEM( tmp, j );
+                       e[j] = (BPy_MVert *)PySequence_GetItem( tmp, j );
                Py_DECREF( tmp );
 
                if( nverts == 2 )
@@ -2518,12 +2574,20 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                                tmppair->swap = 1;
                        } else {
                                MEM_freeN( newpair );
+                               for(j = 0; j < nverts; ++j )
+                                       Py_DECREF( e[j] );
                                Py_DECREF( args );
                                return EXPP_ReturnPyObjError( PyExc_ValueError,
                                                "tuple contains duplicate vertices" );
                        }
+                       tmppair->index = new_edge_count;
+                       ++new_edge_count;
                        tmppair++;
                }
+
+               /* free the new references */
+               for( j = 0; j < nverts; ++j )
+                       Py_DECREF( e[j] );
        }
 
        /* sort the new edge pairs */
@@ -2605,6 +2669,9 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                }
                mesh->medge = tmpedge;          /* point to the new edge list */
 
+       /* resort edges into original order */
+               qsort( newpair, new_edge_count, sizeof(SrchEdges), medge_index_comp );
+
        /* point to the first edge we're going to add */
                tmpedge = &mesh->medge[mesh->totedge];
                tmppair = newpair;
@@ -2632,7 +2699,7 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
        mesh_update( mesh );
        MEM_freeN( newpair );
        Py_DECREF ( args );
-       return EXPP_incr_ret( Py_None );
+       Py_RETURN_NONE;
 }
 
 static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
@@ -2644,19 +2711,23 @@ static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
        int i, len;
        int face_count, edge_count, vert_count;
 
-       Py_INCREF( args );              /* so we can safely DECREF later */
-
-       /* accept a sequence (lists or tuples) also */
+       /*
+        * if input tuple contains a single sequence, use it as input instead;
+        * otherwise use the sequence as-is and check later that it contains
+        * one or more integers or MVerts
+        */
        if( PySequence_Size( args ) == 1 ) {
                PyObject *tmp = PyTuple_GET_ITEM( args, 0 );
-               if( PySequence_Check ( tmp ) ) {
-                       Py_DECREF( args );              /* release previous reference */
-                       args = tmp;                             /* PyTuple_GET_ITEM returns new ref */
-               }
+               if( PySequence_Check( tmp ) ) 
+                       args = tmp;
        }
 
-       /* see how many args we need to parse */
+       /* if sequence is empty, do nothing */
        len = PySequence_Size( args );
+       if( len == 0 ) {
+               Py_RETURN_NONE;
+       }
+
        edge_table = (unsigned int *)MEM_callocN( len*sizeof( unsigned int ),
                        "edge_table" );
 
@@ -2670,7 +2741,6 @@ static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
                else {
                        MEM_freeN( edge_table );
                        Py_DECREF( tmp );
-                       Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_TypeError,
                                        "expected a sequence of ints or MEdges" );
                }
@@ -2679,7 +2749,6 @@ static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
                /* if index out-of-range, throw exception */
                if( edge_table[i] >= (unsigned int)mesh->totedge ) {
                        MEM_freeN( edge_table );
-                       Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_ValueError,
                                        "array index out of range" );
                }
@@ -2773,9 +2842,8 @@ static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
        MEM_freeN( del_table );
        MEM_freeN( vert_table );
        MEM_freeN( edge_table );
-       Py_DECREF( args );
        mesh_update ( mesh );
-       return EXPP_incr_ret( Py_None );
+       Py_RETURN_NONE;
 }
 
 static PyObject *MEdgeSeq_selected( BPy_MEdgeSeq * self )
@@ -3388,21 +3456,22 @@ static int MFace_setUV( BPy_MFace * self, PyObject * value )
        if( !MFace_get_pointer( self ) )
                return -1;
 
-       if( !PyTuple_Check( value ) ||
+       if( !PySequence_Check( value ) ||
                        EXPP_check_sequence_consistency( value, &vector_Type ) != 1 )
                return EXPP_ReturnIntError( PyExc_TypeError,
-                                           "expected tuple of vectors" );
+                                           "expected sequence of vectors" );
 
        length = self->mesh->mface[self->index].v4 ? 4 : 3;
-       if( length != PyTuple_Size( value ) )
+       if( length != PySequence_Size( value ) )
                return EXPP_ReturnIntError( PyExc_TypeError,
-                                           "size of vertex and UV lists differ" );
+                                           "size of vertex and UV sequences differ" );
 
        face = &self->mesh->tface[self->index];
        for( i=0; i<length; ++i ) {
-               VectorObject *vector = (VectorObject *)PyTuple_GET_ITEM( value, i );
+               VectorObject *vector = (VectorObject *)PySequence_ITEM( value, i );
                face->uv[i][0] = vector->vec[0];
                face->uv[i][1] = vector->vec[1];
+               Py_DECREF( vector );
        }
        return 0;
 }
@@ -3531,6 +3600,54 @@ static PyObject *MFace_getCol( BPy_MFace * self )
        return attr;
 }
 
+/*
+ * set a face's vertex colors
+ */
+
+static int MFace_setCol( BPy_MFace * self, PyObject *value )
+{
+       int length, i;
+       MCol * mcol;
+
+       /* if there's no mesh color vectors or texture faces, nothing to do */
+
+       if( !self->mesh->mcol && !self->mesh->tface )
+               return EXPP_ReturnIntError( PyExc_ValueError,
+                               "face has no vertex colors" );
+
+       if( !MFace_get_pointer( self ) )
+               return -1;
+
+       if( self->mesh->tface )
+               mcol = (MCol *) self->mesh->tface[self->index].col;
+       else
+               mcol = &self->mesh->mcol[self->index*4];
+
+       length = self->mesh->mface[self->index].v4 ? 4 : 3;
+
+       if( !PyList_Check( value ) && !PyTuple_Check( value ) )
+               return EXPP_ReturnIntError( PyExc_TypeError,
+                               "expected a sequence of MCols" );
+
+       if( EXPP_check_sequence_consistency( value, &MCol_Type ) != 1 )
+               return EXPP_ReturnIntError( PyExc_TypeError,
+                               "expected a sequence of MCols" );
+
+       if( PySequence_Size( value ) != length )
+               return EXPP_ReturnIntError( PyExc_ValueError,
+                               "incorrect number of colors for this face" );
+
+       for( i=0; i<length; ++i ) {
+               BPy_MCol *obj = (BPy_MCol *)PySequence_ITEM( value, i );
+               mcol[i].r = obj->color->r;
+               mcol[i].g = obj->color->g;
+               mcol[i].b = obj->color->b;
+               mcol[i].a = obj->color->a;
+               Py_DECREF( obj );
+       }
+       return 0;
+}
+
 /************************************************************************
  *
  * Python MFace_Type attributes get/set structure
@@ -3575,7 +3692,7 @@ static PyGetSetDef BPy_MFace_getseters[] = {
        /* attributes for texture faces (mostly, I think) */
 
     {"col",
-     (getter)MFace_getCol, (setter)NULL,
+     (getter)MFace_getCol, (setter)MFace_setCol,
      "face's vertex colors",
      NULL},
     {"flag",
@@ -3888,43 +4005,56 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
        tmp = MEdgeSeq_extend( self, args );
        if( !tmp )
                return NULL;
-       
+
        Py_DECREF( tmp );
 
-       /* make sure we get a sequence of tuples of something */
+       /* make sure we get a tuple of sequences of something */
 
-       switch( PySequence_Size ( args ) ) {
-       case 1:         /* better be a list or a tuple */
-               args = PyTuple_GET_ITEM( args, 0 );
-               if( !PySequence_Check ( args ) )
+       switch( PySequence_Size( args ) ) {
+       case 1:         /* better be a sequence or a tuple */
+               /* if a sequence... */
+               tmp = PyTuple_GET_ITEM( args, 0 );
+               if( PySequence_Check( tmp ) ) {
+                       /* if another sequence, use it */
+                       PyObject *tmp2 = PySequence_ITEM( tmp, 0 );
+                       if( PySequence_Check( tmp2 ) )
+                               args = tmp;
+                       Py_INCREF( args );
+                       Py_DECREF( tmp2 );
+               } else
                        return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                       "expected a sequence of tuple pairs" );
-               Py_INCREF( args );              /* so we can safely DECREF later */
+                                       "expected a sequence of sequence pairs" );
                break;
        case 2: 
        case 3:
        case 4:         /* two to four args may be individual verts */
                tmp = PyTuple_GET_ITEM( args, 0 );
-               if( PyTuple_Check( tmp ) ) {/* maybe just tuples, so use args as-is */
+               /*
+                * if first item isn't a sequence, then assume it's a bunch of MVerts
+                * and wrap inside a tuple
+                */
+               if( !PySequence_Check( tmp ) ) {
+                       args = Py_BuildValue( "(O)", args );
+                       if( !args )
+                               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                                               "Py_BuildValue() failed" );
+               /*
+                * otherwise, assume it already a bunch of sequences so use as-is
+                */
+               } else { 
                        Py_INCREF( args );              /* so we can safely DECREF later */
-                       break;
                }
-               args = Py_BuildValue( "(O)", args );
-               if( !args )
-                       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "Py_BuildValue() failed" );
                break;
        default:        /* anything else is definitely wrong */
                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                               "expected a sequence of tuple pairs" );
+                               "expected a sequence of sequence pairs" );
        }
 
-       /* make sure there is something to add */
+       /* if nothing to add, just exit */
        len = PySequence_Size( args );
        if( len == 0 ) {
                Py_DECREF( args );
-               return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected at least one tuple" );
+               Py_RETURN_NONE;
        }
 
        /* verify the param list and get a total count of number of edges */
@@ -3933,19 +4063,19 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                tmp = PySequence_GetItem( args, i );
 
                /* not a tuple of MVerts... error */
-               if( !PyTuple_Check( tmp ) ||
+               if( !PySequence_Check( tmp ) ||
                                EXPP_check_sequence_consistency( tmp, &MVert_Type ) != 1 ) {
                        Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected sequence of MVert tuples" );
+                               "expected sequence of MVert sequences" );
                }
 
                /* not the right number of MVerts... error */
-               nverts = PyTuple_Size( tmp );
+               nverts = PySequence_Size( tmp );
                if( nverts < 2 || nverts > 4 ) {
                        Py_DECREF( args );
                        return EXPP_ReturnPyObjError( PyExc_ValueError,
-                               "expected 2 to 4 MVerts per tuple" );
+                               "expected 2 to 4 MVerts per sequence" );
                }
 
                if( nverts != 2 )               /* new faces cannot have only 2 verts */
@@ -3965,7 +4095,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                unsigned int vert[4]={0,0,0,0};
                unsigned char order[4]={0,1,2,3};
                tmp = PySequence_GetItem( args, i );
-               nverts = PyTuple_Size( tmp );
+               nverts = PySequence_Size( tmp );
 
                if( nverts == 2 )       /* again, ignore 2-vert tuples */
                        break;
@@ -3975,15 +4105,19 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                 * vertices are not index 0
                 */
 
-               e = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 0 );
+               e = (BPy_MVert *)PySequence_ITEM( tmp, 0 );
                tmpface.v1 = e->index;
-               e = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 1 );
+               Py_DECREF( e );
+               e = (BPy_MVert *)PySequence_ITEM( tmp, 1 );
                tmpface.v2 = e->index;
-               e = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 2 );
+               Py_DECREF( e );
+               e = (BPy_MVert *)PySequence_ITEM( tmp, 2 );
                tmpface.v3 = e->index;
+               Py_DECREF( e );
                if( nverts == 4 ) {
-                       e = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 3 );
+                       e = (BPy_MVert *)PySequence_ITEM( tmp, 3 );
                        tmpface.v4 = e->index;
+                       Py_DECREF( e );
                }
                Py_DECREF( tmp );
 
@@ -4016,6 +4150,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                        }
                        tmppair->v[j] = vert[j];
                }
+               tmppair->index = i;
 
                /* pack order into a byte */
                tmppair->order = order[0]|(order[1]<<2)|(order[2]<<4)|(order[3]<<6);
@@ -4111,6 +4246,9 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
                        mesh->tface = tmptface;
                }
 
+       /* sort the faces back into their original input list order */
+               qsort( newpair, new_face_count, sizeof(SrchFaces), mface_index_comp );
+
        /* allocate new face list */
                tmpface = MEM_callocN(totface*sizeof(MFace), "Mesh_addFaces");
 
@@ -4157,7 +4295,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
        mesh_update( mesh );
        Py_DECREF ( args );
        MEM_freeN( newpair );
-       return EXPP_incr_ret( Py_None );
+       Py_RETURN_NONE;
 }
 
 struct fourEdges
@@ -4196,7 +4334,7 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
                if( BPy_MFace_Check( tmp ) )
                        face_table[i] = ((BPy_MFace *)tmp)->index;
                else if( PyInt_CheckExact( tmp ) )
-                       face_table[i] = PyInt_AsLong ( tmp );
+                       face_table[i] = PyInt_AsLong( tmp );
                else {
                        MEM_freeN( face_table );
                        Py_DECREF( tmp );
@@ -4276,7 +4414,7 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
                        verts[0] = tmpface->v1;
                        verts[1] = tmpface->v2;
                        verts[2] = tmpface->v3;
-                       if(len == 4)
+                       if( len == 4 )
                                verts[3] = tmpface->v4;
                        for( j = 0; j < len; ++j ) {
                                k = (j+1) % len;
@@ -5373,7 +5511,53 @@ static PyObject *Mesh_getVertGroupNames( BPy_Mesh * self )
        return list;
 }
 
-#ifdef MESH_TOOLS
+static PyObject *Mesh_getVertexInfluences( BPy_Mesh * self, PyObject * args )
+{
+       int index;
+       PyObject *influence_list = NULL;
+       Object *object = self->object;
+       Mesh *me = self->mesh;
+
+       /* Get a reference to the mesh object wrapped in here. */
+       if( !object )
+               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                               "This mesh must be linked to an object" ); 
+
+       /* Parse the parameters: only on integer (vertex index) */
+       if( !PyArg_ParseTuple( args, "i", &index ) )
+               return EXPP_ReturnPyObjError( PyExc_TypeError,
+                               "expected int argument (index of the vertex)" );
+
+       /* check for valid index */
+       if( index < 0 || index >= me->totvert )
+               return EXPP_ReturnPyObjError( PyExc_IndexError,
+                               "vertex index out of range" );
+
+       influence_list = PyList_New( 0 );
+
+       /* Proceed only if we have vertex deformation information */
+       if( me->dvert ) {
+               int i;
+               MDeformWeight *sweight = NULL;
+
+               /* Number of bones influencing the vertex */
+               int totinfluences = me->dvert[index].totweight;
+
+               /* Get the reference of the first weight structure */
+               sweight = me->dvert[index].dw;
+
+               /* Build the list only with weights and names of the influent bones */
+               for( i = 0; i < totinfluences; i++, sweight++ ) {
+                       bDeformGroup *defgroup = BLI_findlink( &object->defbase,
+                                       sweight->def_nr );
+                       if( defgroup )
+                               PyList_Append( influence_list, Py_BuildValue( "[sf]",
+                                               defgroup->name, sweight->weight ) ); 
+               }
+       }
+
+       return influence_list;
+}
 
 static PyObject *Mesh_Tools( BPy_Mesh * self, int type, void **args )
 {
@@ -5575,8 +5759,6 @@ static PyObject *Mesh_fill( BPy_Mesh * self )
        return Mesh_Tools( self, MESH_TOOL_FILL, NULL );
 }
 
-#endif
-
 static struct PyMethodDef BPy_Mesh_methods[] = {
        {"calcNormals", (PyCFunction)Mesh_calcNormals, METH_NOARGS,
                "all recalculate vertex normals"},
@@ -5604,10 +5786,10 @@ static struct PyMethodDef BPy_Mesh_methods[] = {
                "Rename an existing vertex group"},
        {"getVertGroupNames", (PyCFunction)Mesh_getVertGroupNames, METH_NOARGS,
                "Get names of vertex groups"},
+       {"getVertexInfluences", (PyCFunction)Mesh_getVertexInfluences, METH_VARARGS,
+               "Get list of the influences of bones for a given mesh vertex"},
 
-
-
-#ifdef MESH_TOOLS
+       /* Mesh tools */
        {"smooth", (PyCFunction)Mesh_smooth, METH_NOARGS,
                "Flattens angle of selected faces (experimental)"},
        {"flipNormals", (PyCFunction)Mesh_flipNormals, METH_NOARGS,
@@ -5626,7 +5808,6 @@ static struct PyMethodDef BPy_Mesh_methods[] = {
                "Removes duplicates from selected vertices (experimental)"},
        {"recalcNormals", (PyCFunction)Mesh_recalcNormals, METH_VARARGS,
                "Recalculates inside or outside normals (experimental)"},
-#endif
        {NULL, NULL, 0, NULL}
 };
 
@@ -5906,8 +6087,12 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
                                MEM_freeN( mesh->tface );
                                mesh->tface = NULL;
                        }
-               } else if( !mesh->tface )
+               } else if( !mesh->tface ) {
+                       if( !mesh->totface )
+                               return EXPP_ReturnIntError( PyExc_RuntimeError,
+                                       "mesh has no faces" );
                        make_tfaces( mesh );
+               }
                return 0;
        case MESH_HASMCOL:
                if( !param ) {
@@ -6098,8 +6283,6 @@ static PyGetSetDef BPy_Mesh_getseters[] = {
         (getter)Mesh_getMode, (setter)Mesh_setMode,
         "The mesh's mode bitfield",
         NULL},
-
-
        {"faceUV",
         (getter)Mesh_getFlag, (setter)Mesh_setFlag,
         "UV-mapped textured faces enabled",
@@ -6124,11 +6307,6 @@ static PyGetSetDef BPy_Mesh_getseters[] = {
        {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
 };
 
-/*****************************************************************************/
-/* Python Mesh_Type callback function prototypes:                           */
-/*****************************************************************************/
-static void Mesh_dealloc( BPy_Mesh * object );
-
 /*****************************************************************************/
 /* Python Mesh_Type structure definition:                                   */
 /*****************************************************************************/
@@ -6329,6 +6507,28 @@ static PyObject *M_Mesh_MVert( PyObject * self, PyObject * args )
        return PVert_CreatePyObject( &vert );
 }
 
+static PyObject *M_Mesh_Modes( PyObject * self, PyObject * args )
+{
+       int modes = 0;
+
+       if( !G.scene ) {
+               Py_RETURN_NONE;
+       }
+
+       if( !PyArg_ParseTuple( args, "|i", &modes ) )
+               return EXPP_ReturnPyObjError( PyExc_TypeError,
+                                             "expected optional int as argument" );
+
+       if( modes > ( SCE_SELECT_VERTEX | SCE_SELECT_EDGE | SCE_SELECT_FACE ) )
+               return EXPP_ReturnPyObjError( PyExc_ValueError,
+                                             "value out of range" );
+
+       if( modes > 0 )
+               G.scene->selectmode = modes;
+       
+       return PyInt_FromLong( G.scene->selectmode );
+}
+
 static struct PyMethodDef M_Mesh_methods[] = {
        {"New", (PyCFunction)M_Mesh_New, METH_VARARGS,
                "Create a new mesh"},
@@ -6336,10 +6536,12 @@ static struct PyMethodDef M_Mesh_methods[] = {
                "Get a mesh by name"},
        {"MVert", (PyCFunction)M_Mesh_MVert, METH_VARARGS,
                "Create a new MVert"},
+       {"Mode", (PyCFunction)M_Mesh_Modes, METH_VARARGS,
+               "Get/set edit selection mode(s)"},
        {NULL, NULL, 0, NULL},
 };
 
-static PyObject *M_Mesh_Modes( void )
+static PyObject *M_Mesh_ModesDict( void )
 {
        PyObject *Modes = PyConstant_New(  );
 
@@ -6444,18 +6646,32 @@ static PyObject *M_Mesh_VertAssignDict( void )
        return Vert;
 }
 
+
+static PyObject *M_Mesh_SelectModeDict( void )
+{
+       PyObject *Mode = PyConstant_New(  );
+       if( Mode ) {
+               BPy_constant *d = ( BPy_constant * ) Mode;
+               PyConstant_Insert(d, "VERTEX", PyInt_FromLong(SCE_SELECT_VERTEX));
+               PyConstant_Insert(d, "EDGE", PyInt_FromLong(SCE_SELECT_EDGE));
+               PyConstant_Insert(d, "FACE", PyInt_FromLong(SCE_SELECT_FACE));
+       }
+       return Mode;
+}
+
 static char M_Mesh_doc[] = "The Blender.Mesh submodule";
 
 PyObject *Mesh_Init( void )
 {
        PyObject *submodule;
 
-       PyObject *Modes = M_Mesh_Modes );
-       PyObject *FaceFlags = M_Mesh_FaceFlagsDict(  );
-       PyObject *FaceModes = M_Mesh_FaceModesDict(  );
-       PyObject *FaceTranspModes = M_Mesh_FaceTranspModesDict(  );
+       PyObject *Modes = M_Mesh_ModesDict( );
+       PyObject *FaceFlags = M_Mesh_FaceFlagsDict( );
+       PyObject *FaceModes = M_Mesh_FaceModesDict( );
+       PyObject *FaceTranspModes = M_Mesh_FaceTranspModesDict( );
        PyObject *EdgeFlags = M_Mesh_EdgeFlagsDict(  );
-       PyObject *AssignModes = M_Mesh_VertAssignDict(  );
+       PyObject *AssignModes = M_Mesh_VertAssignDict( );
+       PyObject *SelectModes = M_Mesh_SelectModeDict( );
 
        if( PyType_Ready( &MCol_Type ) < 0 )
                return NULL;
@@ -6491,6 +6707,8 @@ PyObject *Mesh_Init( void )
                PyModule_AddObject( submodule, "EdgeFlags", EdgeFlags );
        if( AssignModes )
                PyModule_AddObject( submodule, "AssignModes", AssignModes );
+       if( SelectModes )
+               PyModule_AddObject( submodule, "SelectModes", SelectModes );
 
 
        return submodule;
index c1ed37bfe43b798db3bac340ee4121f8eeecbe11..dd891472155e1a228f7611aa05f15360b1f7898a 100644 (file)
@@ -471,11 +471,15 @@ PyObject *Action_CreatePyObject( struct bAction * act )
 {
        BPy_Action *blen_action;
 
+       if(!act)
+               return EXPP_incr_ret(Py_None);
+
        blen_action =
                ( BPy_Action * ) PyObject_NEW( BPy_Action, &Action_Type );
 
-       if( blen_action == NULL ) {
-               return ( NULL );
+       if( !blen_action) {
+               return ( EXPP_ReturnPyObjError
+                        ( PyExc_RuntimeError, "failure to create object!" ) );
        }
        blen_action->action = act;
        return ( ( PyObject * ) blen_action );
index 11b44f2401b2ccc0ad833ce8bc085c1991beedcb..07632124bba6154124acb8ec22667a1b26b7aec4 100644 (file)
@@ -39,6 +39,8 @@
 /** NLA module initialization function. */
 PyObject *NLA_Init( void );
 
+extern PyTypeObject Action_Type;
+
 /** Python BPy_NLA structure definition. */
 typedef struct {
        PyObject_HEAD 
index f285557d5eea9f00d02cfd45fd4531a28297c5b7..293b9a2f3f49a4f0f5fb14b2b9efcf56b3ab15ce 100644 (file)
@@ -1466,71 +1466,55 @@ static PyObject *NMesh_update( PyObject *self, PyObject *a, PyObject *kwd )
  * influences that this vertex receives.
  * @author Jordi Rovira i Bonet
  */
+
 static PyObject *NMesh_getVertexInfluences( PyObject * self, PyObject * args )
 {
        int index;
        PyObject *influence_list = NULL;
-
-       /* Get a reference to the mesh object wrapped in here. */
+       Object *object = ( ( BPy_NMesh * ) self )->object;
        Mesh *me = ( ( BPy_NMesh * ) self )->mesh;
 
+       /* Get a reference to the mesh object wrapped in here. */
        if( !me )
                return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                             "unlinked nmesh: call its .update() method first" );
+                               "unlinked nmesh: call its .update() method first" );
+
+       if( !object )
+               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                               "This mesh must be linked to an object" ); 
 
        /* Parse the parameters: only on integer (vertex index) */
        if( !PyArg_ParseTuple( args, "i", &index ) )
                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                             "expected int argument (index of the vertex)" );
+                               "expected int argument (index of the vertex)" );
+
+       /* check for valid index */
+       if( index < 0 || index >= me->totvert )
+               return EXPP_ReturnPyObjError( PyExc_IndexError,
+                               "vertex index out of range" );
+
+       influence_list = PyList_New( 0 );
 
-       /* Proceed only if we have vertex deformation information and index is valid */
+       /* Proceed only if we have vertex deformation information */
        if( me->dvert ) {
-               if( ( index >= 0 ) && ( index < me->totvert ) ) {
-
-                       int i;
-                       MDeformWeight *sweight = NULL;
-
-                       /* Number of bones influencing the vertex */
-                       int totinfluences = me->dvert[index].totweight;
-
-                       /* Build the list only with weights and names of the influent bones */
-                       /*influence_list = PyList_New(totinfluences); */
-                       influence_list = PyList_New( 0 );
-
-                       /* Get the reference of the first weight structure */
-                       sweight = me->dvert[index].dw;
-
-                       for( i = 0; i < totinfluences; i++ ) {
-                               /*Add the weight and the name of the bone, which is used to identify it */
-
-                                       /* Disabled this code, it couldn't be correct!
-                                        * sweight->data was being set to a posechannel not a bone
-                                        * for one thing, and it is not always set for another.
-                                        * The only thing safe here is to return the defgroup number. -zr
-                                        */
-//                             if( sweight->data )
-                                       /* valid bone: return its name */
-                                       /*  PyList_SetItem(influence_list, i,
-                                          Py_BuildValue("[sf]", sweight->data->name, sweight->weight));
-                                          else // NULL bone: return Py_None instead
-                                          PyList_SetItem(influence_list, i,
-                                          Py_BuildValue("[Of]", Py_None, sweight->weight)); */
-//                                     PyList_Append( influence_list,
-//                                                    Py_BuildValue( "[sf]",
-//                                                                   sweight->
-//                                                                   data->
-//                                                                   name,
-//                                                                   sweight->
-//                                                                   weight ) );
-
-                               /* Next weight */
-                               sweight++;
-                       }
-               } else          //influence_list = PyList_New(0);
-                       return EXPP_ReturnPyObjError( PyExc_IndexError,
-                                                     "vertex index out of range" );
-       } else
-               influence_list = PyList_New( 0 );
+               int i;
+               MDeformWeight *sweight = NULL;
+
+               /* Number of bones influencing the vertex */
+               int totinfluences = me->dvert[index].totweight;
+
+               /* Get the reference of the first weight structure */
+               sweight = me->dvert[index].dw;
+
+               /* Build the list only with weights and names of the influent bones */
+               for( i = 0; i < totinfluences; i++, sweight++ ) {
+                       bDeformGroup *defgroup = (bDeformGroup *) BLI_findlink( &object->defbase,
+                                       sweight->def_nr );
+                       if( defgroup )
+                               PyList_Append( influence_list, Py_BuildValue( "[sf]",
+                                               defgroup->name, sweight->weight ) ); 
+               }
+       }
 
        return influence_list;
 }
index 77179aad819b896e3b8ec46c21b3840ec6d2d431..89ad6f365767c05b162353f8c03ad273f55d831f 100644 (file)
@@ -100,7 +100,9 @@ struct rctf;
 #include "NLA.h"
 #include "logic.h"
 #include "Effect.h"
+#include "Pose.h"
 #include "gen_utils.h"
+#include "BIF_editkey.h"
 
 /* Defines for insertIpoKey */
 
@@ -291,6 +293,7 @@ static PyObject *Object_getSBUseEdges( BPy_Object * self );
 static PyObject *Object_setSBUseEdges( BPy_Object * self, PyObject * args );
 static PyObject *Object_getSBStiffQuads( BPy_Object * self );
 static PyObject *Object_setSBStiffQuads( BPy_Object * self, PyObject * args );
+static PyObject *Object_insertShapeKey(BPy_Object * self);
 /*****************************************************************************/
 /* Python BPy_Object methods table:                                       */
 /*****************************************************************************/
@@ -322,7 +325,7 @@ If 'name_only' is nonzero or True, only the name of the datablock is returned"},
        {"getAction", ( PyCFunction ) Object_getAction, METH_NOARGS,
         "Returns the active action for this object"},
        {"getPose", ( PyCFunction ) Object_getPose, METH_NOARGS,
-        "Returns the pose for this object"},
+       "() - returns the pose from an object if it exists, else None"},
        {"isSelected", ( PyCFunction ) Object_isSelected, METH_NOARGS,
         "Return a 1 or 0 depending on whether the object is selected"},
        {"getEuler", ( PyCFunction ) Object_getEuler, METH_NOARGS,
@@ -585,7 +588,8 @@ works only if self and the object specified are of the same type."},
         "([s1<,s2,s3...>]) - Delete specified scriptlinks from this object."},
        {"setDupliVerts", ( PyCFunction ) Object_setDupliVerts,
         METH_VARARGS, "() - set or reset duplicate child objects on all vertices"},
-       
+        {"insertShapeKey", ( PyCFunction ) Object_insertShapeKey,
+        METH_NOARGS, "() - Insert a Shape Key in the current object"},
        {NULL, NULL, 0, NULL}
 };
 
@@ -750,9 +754,13 @@ PyObject *M_Object_Get( PyObject * self, PyObject * args )
                object = GetObjectByName( name );
 
                        /* No object exists with the name specified in the argument name. */
-               if( !object )
-                       return EXPP_ReturnPyObjError( PyExc_AttributeError,
-                                                       "Unknown object specified." );
+               if( !object ){
+                       char buffer[128];
+                       PyOS_snprintf( buffer, sizeof(buffer),
+                                                  "object \"%s\" not found", name);
+                       return EXPP_ReturnPyObjError( PyExc_ValueError,
+                                                                                 buffer );
+               }
 
                return Object_CreatePyObject( object );
        } else {
@@ -883,7 +891,7 @@ static PyObject *M_Object_Duplicate( PyObject * self, PyObject * args, PyObject
 /*****************************************************************************/
 PyObject *Object_Init( void )
 {
-       PyObject *module;
+       PyObject *module, *dict;
 
        Object_Type.ob_type = &PyType_Type;
 
@@ -908,6 +916,11 @@ PyObject *Object_Init( void )
        PyModule_AddIntConstant( module, "MAGNET",PFIELD_MAGNET );
        PyModule_AddIntConstant( module, "WIND",PFIELD_WIND );
 
+               //Add SUBMODULES to the module
+       dict = PyModule_GetDict( module ); //borrowed
+       PyDict_SetItemString(dict, "Pose", Pose_Init()); //creates a *new* module
+       //PyDict_SetItemString(dict, "Constraint", Constraint_Init()); //creates a *new* module
+
        return ( module );
 }
 
@@ -1178,6 +1191,7 @@ static PyObject *Object_getAction( BPy_Object * self )
        }
 }
 
+#if 0
 static PyObject *Object_getPose( BPy_Object * self )
 {
        /*BPy_Action *py_action = NULL; */
@@ -1190,6 +1204,14 @@ static PyObject *Object_getPose( BPy_Object * self )
                return Pose_CreatePyObject( self->object->pose );
 }
 
+#endif
+
+static PyObject * Object_getPose(BPy_Object *self)
+{
+       //if there is no pose will return PyNone
+       return PyPose_FromPose(self->object->pose, self->object->id.name+2);
+}
+
 static PyObject *Object_isSelected( BPy_Object * self )
 {
        Base *base;
@@ -3011,6 +3033,12 @@ static PyObject *Object_getEffects( BPy_Object * self )
        return effect_list;
 }
 
+static  PyObject *Object_insertShapeKey(BPy_Object * self)
+{
+       insert_shapekey(self->object);
+       return Py_None;
+}
+
 /*****************************************************************************/
 /* Function:   Object_CreatePyObject                                    */
 /* Description: This function will create a new BlenObject from an existing  */
index 42fe8c516e7b6af7dda114fbab774f93bd27646d..577eb1029a36979b3e31d3faea12eb48de0ea889 100644 (file)
+/* 
+ * $Id:
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA       02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Joseph Gilbert
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
 #include "Pose.h"
-#include "NLA.h" 
-//Action is still there, may move to Action.h
-// Action_Type used for typechecking
-#include "Types.h"
-#include <Python.h>
-//#include <DNA_action_types.h>
-#include "gen_utils.h"
+
+
+#include "mydevice.h"
+#include "BKE_armature.h"
+#include "BKE_main.h"
+#include "BKE_global.h"
 #include "BKE_action.h"
+#include "BKE_utildefines.h"
+#include "BIF_editaction.h"
+#include "BIF_space.h"
+#include "BKE_depsgraph.h"
+#include "DNA_object_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"   //1 - this order
+#include "BSE_editipo.h"                       //2
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "Mathutils.h"
+#include "Object.h"
+#include "NLA.h"
+#include "gen_utils.h"
 
-static void Pose_dealloc( PyObject *self );
-static PyObject *Pose_repr( BPy_Pose *self );
-static PyObject *Pose_fromAction( BPy_Pose *self, PyObject *args);
+extern void chan_calc_mat(bPoseChannel *chan);
+
+//------------------------ERROR CODES---------------------------------
+//This is here just to make me happy and to have more consistant error strings :)
+static const char sPoseError[] = "Pose - Error: ";
+static const char sPoseBadArgs[] = "Pose - Bad Arguments: ";
+static const char sPoseBoneError[] = "PoseBone - Error: ";
+static const char sPoseBoneBadArgs[] = "PoseBone - Bad Arguments: ";
+static const char sPoseBonesDictError[] = "PoseBone - Error: ";
+static const char sPoseBonesDictBadArgs[] = "PoseBone - Bad Arguments: ";
+
+//################## PoseBonesDict_Type (internal) ########################
+/*This is an internal psuedo-dictionary type that allows for manipulation
+* of posechannels inside of a pose structure. It is a subobject of pose.
+* i.e. Pose.bones['key']*/
+//################################################################
+
+//------------------METHOD IMPLEMENTATIONS-----------------------------
+//------------------------Pose.bones.items()
+//Returns a list of key:value pairs like dict.items()
+PyObject* PoseBonesDict_items(BPy_PoseBonesDict *self)
+{
+       return PyDict_Items(self->bonesMap); 
+}
+//------------------------Pose.bones.keys()
+//Returns a list of keys like dict.keys()
+PyObject* PoseBonesDict_keys(BPy_PoseBonesDict *self)
+{
+       return PyDict_Keys(self->bonesMap);
+}
+//------------------------Armature.bones.values()
+//Returns a list of values like dict.values()
+PyObject* PoseBonesDict_values(BPy_PoseBonesDict *self)
+{
+       return PyDict_Values(self->bonesMap);
+}
+//------------------ATTRIBUTE IMPLEMENTATION---------------------------
+//------------------TYPE_OBECT IMPLEMENTATION-----------------------
+//------------------------tp_doc
+//The __doc__ string for this object
+static char BPy_PoseBonesDict_doc[] = "This is an internal subobject of pose\
+designed to act as a Py_PoseBone dictionary.";
 
-static struct PyMethodDef Pose_methods[] = {
-       {"fromAction", ( PyCFunction ) Pose_fromAction,
-        METH_VARARGS, "() - sets the pose based on an action and given time in it."},
-       {0, 0, 0, 0}
+//------------------------tp_methods
+//This contains a list of all methods the object contains
+static PyMethodDef BPy_PoseBonesDict_methods[] = {
+       {"items", (PyCFunction) PoseBonesDict_items, METH_NOARGS, 
+               "() - Returns the key:value pairs from the dictionary"},
+       {"keys", (PyCFunction) PoseBonesDict_keys, METH_NOARGS, 
+               "() - Returns the keys the dictionary"},
+       {"values", (PyCFunction) PoseBonesDict_values, METH_NOARGS, 
+               "() - Returns the values from the dictionary"},
+       {NULL, NULL, 0, NULL}
 };
+//-----------------(internal)
+static int PoseBoneMapping_Init(PyObject *dictionary, ListBase *posechannels){
+       bPoseChannel *pchan = NULL;
+       PyObject *py_posechannel = NULL;
 
-static PyGetSetDef BPy_Pose_getsetters[] = {
-//             {"type",(getter)Key_getType, (setter)NULL,
-               {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
-       };
+       for (pchan = posechannels->first; pchan; pchan = pchan->next){
+               py_posechannel = PyPoseBone_FromPosechannel(pchan);
+               if (!py_posechannel)
+                       return -1;
 
-PyTypeObject Pose_Type = {
-       PyObject_HEAD_INIT( NULL ) 0,   /*ob_size */
-       "Blender Pose",                                 /*tp_name */
-       sizeof( BPy_Pose ),                             /*tp_basicsize */
-       0,                                                              /*tp_itemsize */
-       /* methods */
-       ( destructor ) Pose_dealloc,            /*tp_dealloc */
-       ( printfunc ) 0,                                /*tp_print */
-       ( getattrfunc ) 0,      /*tp_getattr */
-       ( setattrfunc ) 0,                              /*tp_setattr */
-       0,                                                              /*tp_compare*/
-       ( reprfunc ) Pose_repr,                         /* tp_repr */
-       /* Method suites for standard classes */
-
-       NULL,                       /* PyNumberMethods *tp_as_number; */
-       NULL,                       /* PySequenceMethods *tp_as_sequence; */
-       NULL,                       /* PyMappingMethods *tp_as_mapping; */
-
-       /* More standard operations (here for binary compatibility) */
-
-       NULL,                       /* hashfunc tp_hash; */
-       NULL,                       /* ternaryfunc tp_call; */
-       NULL,                       /* reprfunc tp_str; */
-       NULL,                       /* getattrofunc tp_getattro; */
-       NULL,                       /* setattrofunc tp_setattro; */
-
-       /* Functions to access object as input/output buffer */
-       NULL,                       /* PyBufferProcs *tp_as_buffer; */
-
-  /*** Flags to define presence of optional/expanded features ***/
-       Py_TPFLAGS_DEFAULT,         /* long tp_flags; */
-
-       NULL,                       /*  char *tp_doc;  Documentation string */
-  /*** Assigned meaning in release 2.0 ***/
-       /* call function for all accessible objects */
-       NULL,                       /* traverseproc tp_traverse; */
-
-       /* delete references to contained objects */
-       NULL,                       /* inquiry tp_clear; */
-
-  /***  Assigned meaning in release 2.1 ***/
-  /*** rich comparisons ***/
-       NULL,                       /* richcmpfunc tp_richcompare; */
-
-  /***  weak reference enabler ***/
-       0,                          /* long tp_weaklistoffset; */
-
-  /*** Added in release 2.2 ***/
-       /*   Iterators */
-       NULL,                       /* getiterfunc tp_iter; */
-       NULL,                       /* iternextfunc tp_iternext; */
-
-  /*** Attribute descriptor and subclassing stuff ***/
-       Pose_methods,                           /* struct PyMethodDef *tp_methods; */
-       NULL,                       /* struct PyMemberDef *tp_members; */
-       BPy_Pose_getsetters,            /* struct PyGetSetDef *tp_getset; */
-       NULL,                       /* struct _typeobject *tp_base; */
-       NULL,                           /* PyObject *tp_dict; */
-       NULL,                       /* descrgetfunc tp_descr_get; */
-       NULL,                       /* descrsetfunc tp_descr_set; */
-       0,                          /* long tp_dictoffset; */
-       NULL,                       /* initproc tp_init; */
-       NULL,                       /* allocfunc tp_alloc; */
-       NULL,                       /* newfunc tp_new; */
-       /*  Low-level free-memory routine */
-       NULL,                       /* freefunc tp_free;  */
-       /* For PyObject_IS_GC */
-       NULL,                       /* inquiry tp_is_gc;  */
-       NULL,                       /* PyObject *tp_bases; */
-       /* method resolution order */
-       NULL,                       /* PyObject *tp_mro;  */
-       NULL,                       /* PyObject *tp_cache; */
-       NULL,                       /* PyObject *tp_subclasses; */
-       NULL,                       /* PyObject *tp_weaklist; */
-       NULL
+               if(PyDict_SetItem(dictionary, 
+                       PyString_FromString(pchan->name), py_posechannel) == -1){
+                       return -1;
+               }
+               Py_DECREF(py_posechannel);
+       }
+       return 0;
+}
+
+//----------------- BonesDict_InitBones
+static int PoseBonesDict_InitBones(BPy_PoseBonesDict *self)
+{
+       PyDict_Clear(self->bonesMap);
+       if (PoseBoneMapping_Init(self->bonesMap, self->bones) == -1)
+               return 0;
+       return 1;
+} 
+
+//------------------------tp_repr
+//This is the string representation of the object
+static PyObject *PoseBonesDict_repr(BPy_PoseBonesDict *self)
+{
+       char buffer[128], str[4096];
+       PyObject *key, *value;
+       int pos = 0;
+
+       BLI_strncpy(str,"",4096);
+       sprintf(buffer, "[Pose Bone Dict: {");
+       strcat(str,buffer);
+       while (PyDict_Next(self->bonesMap, &pos, &key, &value)) {
+               sprintf(buffer, "%s : %s, ", PyString_AsString(key), 
+                       PyString_AsString(value->ob_type->tp_repr(value)));
+               strcat(str,buffer);
+       }
+       sprintf(buffer, "}]\n");
+       strcat(str,buffer);
+       return PyString_FromString(str);
+}
+
+//------------------------tp_dealloc
+//This tells how to 'tear-down' our object when ref count hits 0
+static void PoseBonesDict_dealloc(BPy_PoseBonesDict * self)
+{
+       Py_DECREF(self->bonesMap);
+       PoseBonesDict_Type.tp_free(self);
+       return;
+}
+//------------------------mp_length
+//This gets the size of the dictionary
+int PoseBonesDict_len(BPy_PoseBonesDict *self)
+{
+       return BLI_countlist(self->bones);
+}
+//-----------------------mp_subscript
+//This defines getting a bone from the dictionary - x = Bones['key']
+PyObject *PoseBonesDict_GetItem(BPy_PoseBonesDict *self, PyObject* key)
+{ 
+       PyObject *value = NULL;
+
+       value = PyDict_GetItem(self->bonesMap, key);
+       if(value == NULL){
+        return EXPP_incr_ret(Py_None);
+       }
+       return EXPP_incr_ret(value);
+}
+//------------------TYPE_OBECT DEFINITION--------------------------
+//Mapping Protocol
+static PyMappingMethods PoseBonesDict_MapMethods = {
+       (inquiry) PoseBonesDict_len,                                    //mp_length
+       (binaryfunc)PoseBonesDict_GetItem,              //mp_subscript
+       0,                                                                                                              //mp_ass_subscript
+};
+//PoseBonesDict TypeObject
+PyTypeObject PoseBonesDict_Type = {
+       PyObject_HEAD_INIT(NULL)                        //tp_head
+       0,                                                                                              //tp_internal
+       "PoseBonesDict",                                                                //tp_name
+       sizeof(BPy_PoseBonesDict),                                      //tp_basicsize
+       0,                                                                                              //tp_itemsize
+       (destructor)PoseBonesDict_dealloc,              //tp_dealloc
+       0,                                                                                              //tp_print
+       0,                                                                                              //tp_getattr
+       0,                                                                                              //tp_setattr
+       0,                                                                                              //tp_compare
+       (reprfunc) PoseBonesDict_repr,                          //tp_repr
+       0,                                                                                              //tp_as_number
+       0,                                                                                              //tp_as_sequence
+       &PoseBonesDict_MapMethods,                              //tp_as_mapping
+       0,                                                                                              //tp_hash
+       0,                                                                                              //tp_call
+       0,                                                                                              //tp_str
+       0,                                                                                              //tp_getattro
+       0,                                                                                              //tp_setattro
+       0,                                                                                              //tp_as_buffer
+       Py_TPFLAGS_DEFAULT,                                     //tp_flags
+       BPy_PoseBonesDict_doc,                                          //tp_doc
+       0,                                                                                              //tp_traverse
+       0,                                                                                              //tp_clear
+       0,                                                                                              //tp_richcompare
+       0,                                                                                              //tp_weaklistoffset
+       0,                                                                                              //tp_iter
+       0,                                                                                              //tp_iternext
+       BPy_PoseBonesDict_methods,                              //tp_methods
+       0,                                                                                              //tp_members
+       0,                                                                                              //tp_getset
+       0,                                                                                              //tp_base
+       0,                                                                                              //tp_dict
+       0,                                                                                              //tp_descr_get
+       0,                                                                                              //tp_descr_set
+       0,                                                                                              //tp_dictoffset
+       0,                                                              //tp_init
+       0,                                                                                              //tp_alloc
+       0,                                                                                              //tp_new
+       0,                                                                                              //tp_free
+       0,                                                                                              //tp_is_gc
+       0,                                                                                              //tp_bases
+       0,                                                                                              //tp_mro
+       0,                                                                                              //tp_cache
+       0,                                                                                              //tp_subclasses
+       0,                                                                                              //tp_weaklist
+       0                                                                                               //tp_del
 };
+//-----------------------PyPoseBonesDict_FromPyPose
+static PyObject *PyPoseBonesDict_FromPyPose(BPy_Pose *py_pose)
+{
+       BPy_PoseBonesDict *py_posebonesdict = NULL;
+
+       //create py object
+       py_posebonesdict = (BPy_PoseBonesDict *)PoseBonesDict_Type.tp_alloc(&PoseBonesDict_Type, 0); 
+       if (!py_posebonesdict)
+               goto RuntimeError;
 
-static void Pose_dealloc( PyObject * self )
+       //create internal dictionaries
+       py_posebonesdict->bonesMap = PyDict_New();
+       if (!py_posebonesdict->bonesMap)
+               goto RuntimeError;
+
+       //set listbase pointer
+       py_posebonesdict->bones = &py_pose->pose->chanbase;
+
+       //now that everything is setup - init the mappings
+       if (!PoseBonesDict_InitBones(py_posebonesdict))
+               goto RuntimeError;
+
+       return (PyObject*)py_posebonesdict;
+
+RuntimeError:
+       return EXPP_objError(PyExc_RuntimeError, "%s%s", 
+               sPoseBonesDictError, "Failed to create class");
+}
+
+//################## Pose_Type ##########################
+/*This type is a wrapper for a pose*/
+//####################################################
+//------------------METHOD IMPLEMENTATIONS------------------------------
+static PyObject *Pose_update(BPy_Pose *self)
+{
+       Object *daddy = NULL;
+
+       self->pose->flag |= POSE_RECALC;
+
+       for (daddy = G.main->object.first; daddy; daddy = daddy->id.next){
+               if (daddy->pose == self->pose){
+                       break;
+               }
+       }
+
+       if(daddy)
+               where_is_pose(daddy);
+
+       return EXPP_incr_ret(Py_None);
+}
+//------------------------tp_methods
+//This contains a list of all methods the object contains
+static PyMethodDef BPy_Pose_methods[] = {
+       {"update", (PyCFunction) Pose_update, METH_NOARGS, 
+               "() - Rebuilds the pose with new values"},
+       {NULL, NULL, 0, NULL}
+};
+//------------------ATTRIBUTE IMPLEMENTATIONS---------------------------
+//------------------------Pose.bones (getter)
+//Gets the bones attribute
+static PyObject *Pose_getBoneDict(BPy_Pose *self, void *closure)
+{
+    return EXPP_incr_ret((PyObject*)self->Bones);
+}
+//------------------------Pose.bones (setter)
+//Sets the bones attribute
+static int Pose_setBoneDict(BPy_Pose *self, PyObject *value, void *closure)
+{
+       goto AttributeError;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s", 
+               sPoseError, "You are not allowed to change the .bones attribute");
+}
+//------------------TYPE_OBECT IMPLEMENTATION---------------------------
+//------------------------tp_getset
+//This contains methods for attributes that require checking
+static PyGetSetDef BPy_Pose_getset[] = {
+       {"bones", (getter)Pose_getBoneDict, (setter)Pose_setBoneDict, 
+               "The pose's Bone dictionary", NULL},
+       {NULL, NULL, NULL, NULL, NULL}
+};
+//------------------------tp_dealloc
+//This tells how to 'tear-down' our object when ref count hits 0
+static void Pose_dealloc(BPy_Pose *self)
 {
-       PyObject_DEL( self );
+       Py_DECREF(self->Bones);
+       Pose_Type.tp_free(self);
+       return;
 }
+//------------------------tp_repr
+//This is the string representation of the object
+static PyObject *Pose_repr(BPy_Pose *self)
+{
+       return PyString_FromFormat( "[Pose \"%s\"]", self->name); 
+}
+//------------------------tp_doc
+//The __doc__ string for this object
+static char BPy_Pose_doc[] = "This object wraps a Blender Pose object.";
 
-PyObject *Pose_CreatePyObject( struct bPose * pose )
-       {
-               BPy_Pose *pypose;
-       
-               pypose =
-                       ( BPy_Pose * ) PyObject_NEW( BPy_Pose, &Pose_Type );
+//------------------TYPE_OBECT DEFINITION--------------------------
+PyTypeObject Pose_Type = {
+       PyObject_HEAD_INIT(NULL)   //tp_head
+       0,                                                                              //tp_internal
+       "Pose",                                                         //tp_name
+       sizeof(BPy_Pose),                                       //tp_basicsize
+       0,                                                                              //tp_itemsize
+       (destructor)Pose_dealloc,               //tp_dealloc
+       0,                                                                              //tp_print
+       0,                                                                              //tp_getattr
+       0,                                                                              //tp_setattr
+       0,                                                                              //tp_compare
+       (reprfunc)Pose_repr,                            //tp_repr
+       0,                                                                              //tp_as_number
+       0,                                                                              //tp_as_sequence
+       0,                                                                              //tp_as_mapping
+       0,                                                                              //tp_hash
+       0,                                                                              //tp_call
+       0,                                                                              //tp_str
+       0,                                                                              //tp_getattro
+       0,                                                                              //tp_setattro
+       0,                                                                              //tp_as_buffer
+       Py_TPFLAGS_DEFAULT,         //tp_flags
+       BPy_Pose_doc,                                   //tp_doc
+       0,                                                                              //tp_traverse
+       0,                                                                              //tp_clear
+       0,                                                                              //tp_richcompare
+       0,                                                                              //tp_weaklistoffset
+       0,                                                                              //tp_iter
+       0,                                                                              //tp_iternext
+       BPy_Pose_methods,                               //tp_methods
+       0,                                                                              //tp_members
+       BPy_Pose_getset,                                        //tp_getset
+       0,                                                                              //tp_base
+       0,                                                                              //tp_dict
+       0,                                                                              //tp_descr_get
+       0,                                                                              //tp_descr_set
+       0,                                                                              //tp_dictoffset
+       0,                                                                              //tp_init
+       0,                                                                              //tp_alloc
+       0,                                                                              //tp_new
+       0,                                                                              //tp_free
+       0,                                                                              //tp_is_gc
+       0,                                                                              //tp_bases
+       0,                                                                              //tp_mro
+       0,                                                                              //tp_cache
+       0,                                                                              //tp_subclasses
+       0,                                                                              //tp_weaklist
+       0                                                                               //tp_del
+};
+//################## PoseBone_Type #####################
+/*This type is a wrapper for a posechannel*/
+//####################################################
+//------------------METHOD IMPLEMENTATIONS------------------------------
+//------------------------------PoseBone.insertKey()
+static PyObject *PoseBone_insertKey(BPy_PoseBone *self, PyObject *args)
+{
+       PyObject *parent_object = NULL;
+       PyObject *constants = NULL, *item = NULL;
+       int frame = 1, oldframe, length, x, numeric_value = 0, oldflag;
+       bPoseChannel *pchan = NULL;
        
-               if( !pypose )
-                       return EXPP_ReturnPyObjError( PyExc_MemoryError,
-                                                     "couldn't create BPy_Pose object" );
 
-               PyType_Ready(&Pose_Type);
+       if (!PyArg_ParseTuple(args, "O!i|O", &Object_Type, &parent_object, &frame, &constants ))
+               goto AttributeError;
+
+       //verify that this pchannel is part of the object->pose
+       for (pchan = ((BPy_Object*)parent_object)->object->pose->chanbase.first; 
+               pchan; pchan = pchan->next){
+               if (pchan == self->posechannel)
+                       break;
+       }
+       if (!pchan)
+               goto AttributeError2;
+
+       //verify that there is an action bound to this object
+       if (!((BPy_Object*)parent_object)->object->action){
+               goto AttributeError5;
+       }
 
-               pypose->pose = pose;
-               return ( ( PyObject * ) pypose );
+       oldflag = self->posechannel->flag;
+       self->posechannel->flag = 0;
+       //set the flags for this posechannel
+       if (constants){
+               if(PySequence_Check(constants)){
+                       length = PySequence_Length(constants);
+                       for (x = 0; x < length; x++){
+                               item = PySequence_GetItem(constants, x);
+                               if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "ROT")){
+                                       numeric_value |= POSE_ROT;
+                               }else if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "LOC")){
+                                       numeric_value |= POSE_LOC;
+                               }else if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "SIZE")){
+                                       numeric_value |= POSE_SIZE;
+                               }else{
+                                       Py_DECREF(item);
+                                       self->posechannel->flag = (short)oldflag;
+                                       goto AttributeError4;
+                               }
+                               Py_DECREF(item);
+                       }
+                       self->posechannel->flag = (short)numeric_value;
+               }else if (BPy_Constant_Check(constants)){
+                       if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "ROT")){
+                               numeric_value |= POSE_ROT;
+                       }else if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "LOC")){
+                               numeric_value |= POSE_LOC;
+                       }else if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "SIZE")){
+                               numeric_value |= POSE_SIZE;
+                       }else{
+                               self->posechannel->flag = (short)oldflag;
+                               goto AttributeError4;
+                       }
+                       self->posechannel->flag = (short)numeric_value;
+               }else{
+                       goto AttributeError3;
+               }
+       }else{ //nothing passed so set them all
+               self->posechannel->flag |= POSE_ROT;
+               self->posechannel->flag |= POSE_LOC;
+               self->posechannel->flag |= POSE_SIZE;
        }
 
-static PyObject *Pose_fromAction( BPy_Pose *self, PyObject *args)  {
-       BPy_Action *action;
-       float time;
-       float factor = 1.0;
+       //set the frame we want insertion on
+       oldframe = G.scene->r.cfra;
+       G.scene->r.cfra = (short)frame;
+
+       //add the action channel if it's not there
+       verify_action_channel(((BPy_Object*)parent_object)->object->action, 
+               self->posechannel->name);
+
+       //insert the pose keys
+       if (self->posechannel->flag & POSE_ROT){
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_QUAT_X);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_QUAT_Y);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_QUAT_Z);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_QUAT_W);
+       }
+       if (self->posechannel->flag & POSE_LOC){
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_LOC_X);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_LOC_Y);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_LOC_Z);
+       }
+       if (self->posechannel->flag & POSE_SIZE){
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_SIZE_X);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_SIZE_Y);
+               insertkey(&((BPy_Object*)parent_object)->object->id, 
+                       ID_PO, self->posechannel->name, NULL, AC_SIZE_Z);
+       }
 
-       if (!PyArg_ParseTuple(args, "O!f|f", &Action_Type, &action, &time, &factor))
-                               return EXPP_ReturnPyObjError(PyExc_AttributeError, "An action and a time (as number) required as arguments.");
+       //flip the frame back
+       G.scene->r.cfra = (short)oldframe;
 
-       //todo: range check for time
+       //update the IPOs
+       remake_action_ipos (((BPy_Object*)parent_object)->object->action);
 
-       extract_pose_from_action(self->pose, action->action, time);
+       return EXPP_incr_ret(Py_None);
 
-       Py_RETURN_NONE;
+AttributeError:
+       return EXPP_objError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".insertKey: ", "expects an Object, int, (optional) constants");
+AttributeError2:
+       return EXPP_objError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".insertKey: ", "wrong object detected. \
+               Use the object this pose came from");
+AttributeError3:
+       return EXPP_objError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".insertKey: ", "Expects a constant or list of constants");
+AttributeError4:
+       return EXPP_objError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".insertKey: ", "Please use a constant defined in the Pose module");
+AttributeError5:
+       return EXPP_objError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".insertKey: ", "You must set up and link an Action to this object first");
 }
+//------------------------tp_methods
+//This contains a list of all methods the object contains
+static PyMethodDef BPy_PoseBone_methods[] = {
+       {"insertKey", (PyCFunction) PoseBone_insertKey, METH_VARARGS, 
+               "() - insert a key for this pose into an action"},
+       {NULL, NULL, 0, NULL}
+};
+//------------------ATTRIBUTE IMPLEMENTATIONS---------------------------
+//------------------------PoseBone.name (getter)
+//Gets the name attribute
+static PyObject *PoseBone_getName(BPy_PoseBone *self, void *closure)
+{
+    return PyString_FromString(self->posechannel->name);
+}
+//------------------------PoseBone.name (setter)
+//Sets the name attribute
+static int PoseBone_setName(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       char *name = "";
+
+       if (!PyArg_Parse(value, "s", &name))
+               goto AttributeError;
 
-static PyObject *Pose_repr( BPy_Pose * self )
+       BLI_strncpy(self->posechannel->name, name, 32);
+       return 0;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".name: ", "expects a string");
+}
+//------------------------PoseBone.loc (getter)
+//Gets the loc attribute
+static PyObject *PoseBone_getLoc(BPy_PoseBone *self, void *closure)
+{
+    return newVectorObject(self->posechannel->loc, 3, Py_WRAP);
+}
+//------------------------PoseBone.loc (setter)
+//Sets the loc attribute
+static int PoseBone_setLoc(BPy_PoseBone *self, PyObject *value, void *closure)
 {
-       return PyString_FromFormat( "[Pose]"); // \"%s\"]", self->key->id.name + 2 );
+       VectorObject *vec = NULL;
+       int x;
+
+       if (!PyArg_Parse(value, "O!", &vector_Type, &vec))
+               goto AttributeError;
+       if (vec->size != 3)
+               goto AttributeError;
+
+       for (x = 0; x < 3; x++){
+               self->posechannel->loc[x] = vec->vec[x];
+       }
+       return 0;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".loc: ", "expects a 3d vector object");
+}
+//------------------------PoseBone.size (getter)
+//Gets the size attribute
+static PyObject *PoseBone_getSize(BPy_PoseBone *self, void *closure)
+{
+    return newVectorObject(self->posechannel->size, 3, Py_WRAP);
+}
+//------------------------PoseBone.size (setter)
+//Sets the size attribute
+static int PoseBone_setSize(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       VectorObject *vec = NULL;
+       int x;
+
+       if (!PyArg_Parse(value, "O!", &vector_Type, &vec))
+               goto AttributeError;
+       if (vec->size != 3)
+               goto AttributeError;
+
+       for (x = 0; x < 3; x++){
+               self->posechannel->size[x] = vec->vec[x];
+       }
+       return 0;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".size: ", "expects a 3d vector object");
+}
+//------------------------PoseBone.quat (getter)
+//Gets the quat attribute
+static PyObject *PoseBone_getQuat(BPy_PoseBone *self, void *closure)
+{
+    return newQuaternionObject(self->posechannel->quat, Py_WRAP);
+}
+//------------------------PoseBone.quat (setter)
+//Sets the quat attribute
+static int PoseBone_setQuat(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       QuaternionObject *quat = NULL;
+       int x;
+
+       if (!PyArg_Parse(value, "O!", &quaternion_Type, &quat))
+               goto AttributeError;
+
+       for (x = 0; x < 4; x++){
+               self->posechannel->quat[x] = quat->quat[x];
+       }
+       return 0;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".quat: ", "expects a quaternion object");
+}
+//------------------------PoseBone.localMatrix (getter)
+//Gets the chan_mat
+static PyObject *PoseBone_getLocalMatrix(BPy_PoseBone *self, void *closure)
+{
+    return newMatrixObject((float*)self->posechannel->chan_mat, 4, 4, Py_WRAP);
+}
+//------------------------PoseBone.localMatrix (setter)
+//Sets the chan_mat 
+static int PoseBone_setLocalMatrix(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       MatrixObject *matrix = NULL;
+       float size[3], quat[4], loc[3];
+       float mat3[3][3], mat4[4][4];
+       int matsize = 0;
+
+       if (!PyArg_Parse(value, "O!", &matrix_Type, &matrix))
+               goto AttributeError;
+
+       if (matrix->rowSize == 3 && matrix->colSize == 3){
+               matsize = 3;
+               Mat3CpyMat3(mat3, (float(*)[3])*matrix->matrix);
+       }else if (matrix->rowSize == 4 && matrix->colSize == 4){
+               matsize = 4;
+               Mat4CpyMat4(mat4, (float(*)[4])*matrix->matrix);
+       }
+
+       if (matsize != 3 && matsize != 4){
+               goto AttributeError;
+       }
+
+       //get size and rotation
+       if (matsize == 3){
+               Mat3ToSize(mat3, size);
+               Mat3Ortho(mat3);
+               Mat3ToQuat(mat3, quat);
+       }else if (matsize == 4){
+               Mat4ToSize(mat4, size);
+               Mat4Ortho(mat4);
+               Mat4ToQuat(mat4, quat);
+       }
+
+       //get loc
+       if (matsize == 4){
+               VECCOPY(loc, matrix->matrix[3]);
+       }
+
+       //copy new attributes
+       VECCOPY(self->posechannel->size, size);
+       QUATCOPY(self->posechannel->quat, quat);
+       if (matsize == 4){
+               VECCOPY(self->posechannel->loc, loc);
+       }
+
+       //rebuild matrix
+       chan_calc_mat(self->posechannel);
+       return 0;
+
+AttributeError:
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".localMatrix: ", "expects a 3x3 or 4x4 matrix object");
+}
+//------------------------PoseBone.poseMatrix (getter)
+//Gets the pose_mat
+static PyObject *PoseBone_getPoseMatrix(BPy_PoseBone *self, void *closure)
+{
+    return newMatrixObject((float*)self->posechannel->pose_mat, 4, 4, Py_WRAP);
+}
+//------------------------PoseBone.poseMatrix (setter)
+//Sets the pose_mat
+static int PoseBone_setPoseMatrix(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".poseMatrix: ", "not able to set this property");
+}
+////------------------------PoseBone.constraints (getter)
+////Gets the constraints list
+//static PyObject *PoseBone_getConstraints(BPy_PoseBone *self, void *closure)
+//{
+//     PyObject *list = NULL, *py_constraint = NULL;
+//     bConstraint *constraint = NULL;
+//
+//     list = PyList_New(0);
+//     for (constraint = self->posechannel->constraints.first; constraint; constraint = constraint->next){
+//             py_constraint = PyConstraint_FromConstraint(constraint);
+//             if (!py_constraint)
+//                     return NULL;
+//             if (PyList_Append(list, py_constraint) == -1){
+//                     Py_DECREF(py_constraint);
+//                     goto RuntimeError;
+//             }
+//             Py_DECREF(py_constraint);
+//     }
+//     return list;
+//
+//RuntimeError:
+//     return EXPP_objError(PyExc_RuntimeError, "%s%s%s",
+//             sPoseBoneError, ".constraints: ", "unable to build constraint list");
+//}
+////------------------------PoseBone.constraints (setter)
+////Sets the constraints list
+//static int PoseBone_setConstraints(BPy_PoseBone *self, PyObject *value, void *closure)
+//{
+//     printf("This is not implemented yet...");
+//     return 1;
+//}
+//------------------------PoseBone.head (getter)
+//Gets the pose head position
+static PyObject *PoseBone_getHead(BPy_PoseBone *self, void *closure)
+{
+    return newVectorObject(self->posechannel->pose_head, 3, Py_NEW);
+}
+//------------------------PoseBone.head (setter)
+//Sets the pose head position
+static int PoseBone_setHead(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".head: ", "not able to set this property");
+}
+//------------------------PoseBone.tail (getter)
+//Gets the pose tail position
+static PyObject *PoseBone_getTail(BPy_PoseBone *self, void *closure)
+{
+    return newVectorObject(self->posechannel->pose_tail, 3, Py_NEW);
+}
+//------------------------PoseBone.tail (setter)
+//Sets the pose tail position
+static int PoseBone_setTail(BPy_PoseBone *self, PyObject *value, void *closure)
+{
+       return EXPP_intError(PyExc_AttributeError, "%s%s%s",
+               sPoseBoneError, ".tail: ", "not able to set this property");
+}
+//------------------TYPE_OBECT IMPLEMENTATION---------------------------
+//------------------------tp_getset
+//This contains methods for attributes that require checking
+static PyGetSetDef BPy_PoseBone_getset[] = {
+       {"name", (getter)PoseBone_getName, (setter)PoseBone_setName, 
+               "The pose bone's name", NULL},
+       {"loc", (getter)PoseBone_getLoc, (setter)PoseBone_setLoc, 
+               "The pose bone's change in location as a vector", NULL},
+       {"size", (getter)PoseBone_getSize, (setter)PoseBone_setSize, 
+               "The pose bone's change in size as a vector", NULL},
+       {"quat", (getter)PoseBone_getQuat, (setter)PoseBone_setQuat, 
+               "The pose bone's change in rotation as a quat", NULL},
+       {"localMatrix", (getter)PoseBone_getLocalMatrix, (setter)PoseBone_setLocalMatrix, 
+               "The pose bone's change matrix built from the quat, loc, and size", NULL},
+       {"poseMatrix", (getter)PoseBone_getPoseMatrix, (setter)PoseBone_setPoseMatrix, 
+               "The pose bone's matrix", NULL},
+       {"head", (getter)PoseBone_getHead, (setter)PoseBone_setHead, 
+               "The pose bone's head positon", NULL},
+       {"tail", (getter)PoseBone_getTail, (setter)PoseBone_setTail, 
+               "The pose bone's tail positon", NULL},
+       //{"constraints", (getter)PoseBone_getConstraints, (setter)PoseBone_setConstraints, 
+       //      "The list of contraints that pertain to this pose bone", NULL},
+       {NULL, NULL, NULL, NULL, NULL}
+};
+//------------------------tp_dealloc
+//This tells how to 'tear-down' our object when ref count hits 0
+static void PoseBone_dealloc(BPy_PoseBone *self)
+{
+       PoseBone_Type.tp_free(self);
+       return;
+}
+//------------------------tp_repr
+//This is the string representation of the object
+static PyObject *PoseBone_repr(BPy_PoseBone *self)
+{
+       return PyString_FromFormat( "[PoseBone \"%s\"]", self->posechannel->name); 
+}
+//------------------------tp_doc
+//The __doc__ string for this object
+static char BPy_PoseBone_doc[] = "This object wraps a Blender PoseBone object.";
+
+//------------------TYPE_OBECT DEFINITION--------------------------
+PyTypeObject PoseBone_Type = {
+       PyObject_HEAD_INIT(NULL)   //tp_head
+       0,                                                                              //tp_internal
+       "PoseBone",                                                     //tp_name
+       sizeof(BPy_PoseBone),                   //tp_basicsize
+       0,                                                                              //tp_itemsize
+       (destructor)PoseBone_dealloc,           //tp_dealloc
+       0,                                                                              //tp_print
+       0,                                                                              //tp_getattr
+       0,                                                                              //tp_setattr
+       0,                                                                              //tp_compare
+       (reprfunc)PoseBone_repr,                //tp_repr
+       0,                                                                              //tp_as_number
+       0,                                                                              //tp_as_sequence
+       0,                                                                              //tp_as_mapping
+       0,                                                                              //tp_hash
+       0,                                                                              //tp_call
+       0,                                                                              //tp_str
+       0,                                                                              //tp_getattro
+       0,                                                                              //tp_setattro
+       0,                                                                              //tp_as_buffer
+       Py_TPFLAGS_DEFAULT,         //tp_flags
+       BPy_PoseBone_doc,                               //tp_doc
+       0,                                                                              //tp_traverse
+       0,                                                                              //tp_clear
+       0,                                                                              //tp_richcompare
+       0,                                                                              //tp_weaklistoffset
+       0,                                                                              //tp_iter
+       0,                                                                              //tp_iternext
+       BPy_PoseBone_methods,           //tp_methods
+       0,                                                                              //tp_members
+       BPy_PoseBone_getset,                    //tp_getset
+       0,                                                                              //tp_base
+       0,                                                                              //tp_dict
+       0,                                                                              //tp_descr_get
+       0,                                                                              //tp_descr_set
+       0,                                                                              //tp_dictoffset
+       0,                                                                              //tp_init
+       0,                                                                              //tp_alloc
+       0,                                                                              //tp_new
+       0,                                                                              //tp_free
+       0,                                                                              //tp_is_gc
+       0,                                                                              //tp_bases
+       0,                                                                              //tp_mro
+       0,                                                                              //tp_cache
+       0,                                                                              //tp_subclasses
+       0,                                                                              //tp_weaklist
+       0                                                                               //tp_del
+};
+//-------------------MODULE METHODS IMPLEMENTATION------------------------
+//-------------------MODULE METHODS DEFINITION-----------------------------
+struct PyMethodDef M_Pose_methods[] = {
+       {NULL, NULL, 0, NULL}
+};
+//-------------------MODULE INITIALIZATION--------------------------------
+PyObject *Pose_Init(void)
+{
+       PyObject *module;
+
+       //Initializes TypeObject.ob_type
+       if (PyType_Ready(&Pose_Type) < 0 || PyType_Ready(&PoseBone_Type)  < 0 ||
+               PyType_Ready(&PoseBonesDict_Type) < 0) {
+               return EXPP_incr_ret(Py_None);
+       }
+
+       //Register the module
+       module = Py_InitModule3("Blender.Object.Pose", M_Pose_methods, 
+               "The Blender Pose module"); 
+
+       //Add TYPEOBJECTS to the module
+       PyModule_AddObject(module, "Pose", 
+               EXPP_incr_ret((PyObject *)&Pose_Type)); //*steals*
+       PyModule_AddObject(module, "PoseBone", 
+               EXPP_incr_ret((PyObject *)&PoseBone_Type)); //*steals*
+
+       //Add CONSTANTS to the module
+       PyModule_AddObject(module, "ROT", 
+               EXPP_incr_ret(PyConstant_NewInt("ROT", POSE_ROT)));
+       PyModule_AddObject(module, "LOC", 
+               EXPP_incr_ret(PyConstant_NewInt("LOC", POSE_LOC)));
+       PyModule_AddObject(module, "SIZE", 
+               EXPP_incr_ret(PyConstant_NewInt("SIZE", POSE_SIZE)));
+
+       return module;
+}
+//------------------VISIBLE PROTOTYPE IMPLEMENTATION-----------------------
+//------------------------------PyPose_FromPose (internal)
+//Returns a PyPose from a bPose - return PyNone if bPose is NULL
+PyObject *PyPose_FromPose(bPose *pose, char *name)
+{
+       BPy_Pose *py_pose = NULL;
+
+       if (pose){
+               py_pose = (BPy_Pose*)Pose_Type.tp_alloc(&Pose_Type, 0);
+               if (!py_pose)
+                       goto RuntimeError;
+
+               py_pose->pose = pose;
+               BLI_strncpy(py_pose->name, name, 24);
+
+               //create armature.bones
+               py_pose->Bones = (BPy_PoseBonesDict*)PyPoseBonesDict_FromPyPose(py_pose);
+               if (!py_pose->Bones)
+                       goto RuntimeError;
+
+               return (PyObject*)py_pose;
+       }else{
+               return EXPP_incr_ret(Py_None);
+       }
+
+RuntimeError:
+       return EXPP_objError(PyExc_RuntimeError, "%s%s%s", 
+               sPoseError, "PyPose_FromPose: ", "Internal Error Ocurred");
+}
+//------------------------------PyPoseBone_FromPosechannel (internal)
+//Returns a PyPoseBone from a bPoseChannel - return PyNone if bPoseChannel is NULL
+PyObject *PyPoseBone_FromPosechannel(bPoseChannel *pchan)
+{
+       BPy_PoseBone *py_posechannel = NULL;
+
+       if (pchan){
+               py_posechannel = (BPy_PoseBone*)PoseBone_Type.tp_alloc(&PoseBone_Type, 0);
+               if (!py_posechannel)
+                       goto RuntimeError;
+               py_posechannel->posechannel = pchan;
+               return (PyObject*)py_posechannel;
+       }else{
+               return EXPP_incr_ret(Py_None);
+       }
+
+RuntimeError:
+       return EXPP_objError(PyExc_RuntimeError, "%s%s%s", 
+               sPoseBoneError, "PyPoseBone_FromPosechannel: ", "Internal Error Ocurred");
 }
index c1735d1ebd428784b10b6cc4b702d676089f325c..dc90c8820f07b637d1cd5bd148f57bdc562d0a24 100644 (file)
@@ -1,24 +1,68 @@
+/* 
+ * $Id: 
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Joseph Gilbert
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
 #ifndef EXPP_POSE_H
 #define EXPP_POSE_H
 
 #include <Python.h>
+#include "DNA_action_types.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <DNA_action_types.h>
-
-/* EXPP PyType Objects */
+//-------------------TYPE CHECKS---------------------------------
+#define PoseObject_Check(v) ((v)->ob_type == &Pose_Type)
+#define PoseBoneObject_Check(v) ((v)->ob_type == &PoseBone_Type)
+#define PoseBonesDictObject_Check(v) ((v)->ob_type == &PoseBonesDict_Type)
+//-------------------TYPEOBJECT----------------------------------
 extern PyTypeObject Pose_Type;
-
-struct BPy_Pose;
+extern PyTypeObject PoseBone_Type;
+extern PyTypeObject PoseBonesDict_Type;
+//-------------------STRUCT DEFINITION----------------------------
+typedef struct {
+       PyObject_HEAD 
+       PyObject *bonesMap;  
+       ListBase *bones;  
+} BPy_PoseBonesDict;
 
 typedef struct {
-       PyObject_HEAD           /* required python macro   */
-       bPose * pose;
-} BPy_Pose;                    /* a pose */
+       PyObject_HEAD
+       bPose *pose;
+       char name[24];   //because poses have not names :(
+       BPy_PoseBonesDict *Bones; 
+} BPy_Pose;
 
-PyObject *Pose_CreatePyObject( bPose * p );
+typedef struct {
+       PyObject_HEAD
+       bPoseChannel *posechannel;
+} BPy_PoseBone;
 
-#endif /* EXPP_KEY_H */
+//-------------------VISIBLE PROTOTYPES-------------------------
+PyObject *Pose_Init(void);
+PyObject *PyPose_FromPose(bPose *pose, char *name);
+PyObject *PyPoseBone_FromPosechannel(bPoseChannel *pchan);
+#endif
index 8b89296dcde80ae4939c0f2776b4bb6e6cc06dbe..a7ad2581f453bf9eec1136c7144bb4bcc97931bb 100644 (file)
@@ -889,20 +889,23 @@ static PyObject *M_Window_EditMode( PyObject * self, PyObject * args )
        short status = -1;
        char *undo_str = "From script";
        int undo_str_len = 11;
+       int do_undo = 1;
 
-       if( !PyArg_ParseTuple
-           ( args, "|hs#", &status, &undo_str, &undo_str_len ) )
+       if( !PyArg_ParseTuple( args,
+                               "|hs#i", &status, &undo_str, &undo_str_len, &do_undo ) )
                return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                             "expected nothing or an int (bool) and a string as arguments" );
+                               "expected optional int (bool), string and int (bool) as arguments" );
 
        if( status >= 0 ) {
                if( status ) {
                        if( !G.obedit )
                                enter_editmode(  );
                } else if( G.obedit ) {
-                       if( undo_str_len > 63 )
-                               undo_str[63] = '\0';    /* 64 is max */
-                       undo_push_mesh( undo_str );     /* use better solution after 2.34 */
+                       if( do_undo && U.undosteps != 0 ) {
+                               if( undo_str_len > 63 )
+                                       undo_str[63] = '\0';    /* 64 is max */
+                               undo_push_mesh( undo_str );     /* use better solution after 2.34 */
+                       }
                        exit_editmode( 1 );
                }
        }
index 1ebf50ffa55dece9dcd3da88de9a2ac4eac814c7..f28af8efad6257f04549d69d0ca9d3ca2a9fdd44 100644 (file)
@@ -90,7 +90,7 @@ static PyMethodDef BPy_constant_methods[] = {
                "() - Returns the keys the dictionary"},
        {"values", (PyCFunction) constant_values, METH_NOARGS, 
                "() - Returns the values from the dictionary"},
-       {NULL}
+       {NULL, NULL, 0, NULL}
 };
 //------------------------mp_length
 static int constantLength(BPy_constant *self)
index 9a7c16d51688b0dc11c6166aadb6995b0aa266cc..a23999f4a0e20b7e1fed28a0fec1775f0ce9cd27 100644 (file)
@@ -33,6 +33,7 @@ The Blender Python API Reference
   - L{NMesh} (*)
   - L{Noise}
   - L{Object} (*)
+     - L{Pose}
   - L{Registry}
   - L{Scene}
      - L{Radio}
index 79f9481192d95a8a0a7fa6c5c2eac01e927b877c..a8ce2e3c1ebaf775712aa7767d342ac78f789637 100644 (file)
@@ -212,7 +212,7 @@ class Bone:
   @type matrix: Matrix Object
   @ivar parent: The parent Bone.
   @type parent: Bone Object
-  @ivar children: The children bones.
+  @ivar children: The children directly attached to this bone.
   @type children: List of Bone Objects
   @ivar weight: The bone's weight.
   @type weight: Float
@@ -246,6 +246,13 @@ class Bone:
     @rtype: Bool
     """
 
+  def getAllChildren():
+    """
+    Gets all the children under this bone including the children's children.
+    @rtype: List of Bone object
+    @return: all bones under this one
+    """
+
 class Editbone:
   """
   The Editbone Object
@@ -260,7 +267,7 @@ class Editbone:
   @type head: Vector Object
   @ivar tail: This Bone's "tail" ending position when in rest state (armaturespace).
   @type tail: Vector Object
-  @ivar matrix: This Bone's matrix. (armaturespace) This cannot be set.
+  @ivar matrix: This Bone's matrix. (armaturespace)
   @type matrix: Matrix Object
   @ivar parent: The parent Bone.
   @type parent: Editbone Object
index 8621bd18ca020ef6ab8b4b23b816aef1393647d9..01abef7e4306808396f6248c61d27509113483c7 100644 (file)
@@ -297,6 +297,16 @@ class IpoCurve:
         Can be Constant, Extrapolation, Cyclic or Cyclic_extrapolation.
     @rtype: None
     @return: None
+    @note: Cyclic Ipo curves never reach the end value.  If the first and
+    last bezier points do not have the same y coordinate, the value of the
+    curve when it "cycles" is that of the first point.  If a user wants to
+    get the value of the final curve point, read the final point from the
+    curve's L{bezierPoints} attribute::
+
+               ipo = Blender.Object.Get('Cube').ipo
+               icu = ipo.getCurves('LocX')
+               endtime,endvalue = icu.bezierPoints[-1].pt
+
     """
 
   def getExtrapolation():
index 6d3c8316a0ed4843204a72633027d9beaddb4847..795346491a1461311e1f9c70ed93c49a2f31db93 100644 (file)
@@ -6,7 +6,7 @@ The Blender.Key submodule.
 This module provides access to B{Key} objects in Blender.
 
 @type Types: readonly dictionary
-@var Types: The type of a key, indicating the type of data in the
+@var Types: The type of a key owner, indicating the type of data in the
 data blocks.
     - MESH - the key is a Mesh key; data blocks contain
     L{NMVert<NMesh.NMVert>} vertices.
@@ -15,7 +15,6 @@ data blocks.
     3 floating point numbers).
     - LATTICE - the key is a Lattice key; data blocks contain
     BPoints, each point represented by a list of 3 floating point numbers.
-
 """
 
 def Get(name = None):
@@ -38,7 +37,7 @@ class Key:
     keyframe data.
     
     @ivar ipo:  Key Ipo.  Contains the Ipo if one is assigned to the
-    object, B{None} otherwise.  Setting to B{None} clears the current Ipo..
+    object, B{None} otherwise.  Setting to B{None} clears the current Ipo.
     @type ipo:  Blender Ipo
     @ivar value: The value of the key. Read-only.
     @type value: float
@@ -47,6 +46,8 @@ class Key:
     @type type: int
     @ivar blocks: A list of KeyBlocks for the key.  Read-only.
     @type blocks: Blender KeyBlock.
+    @ivar relative: Indicates whether the key is relative(=True) or normal.
+    @type relative: bool
     """
 
     def getIpo():
@@ -66,6 +67,8 @@ class KeyBlock:
   Each Key object has a list of KeyBlocks attached, each KeyBlock
   representing a keyframe.
 
+  @ivar curval: Current value of the corresponding IpoCurve.  Read-only.
+  @type curval: float
   @ivar name: The name of the Keyblock.  Truncated to 32 characters.
   @type name: string
   @ivar pos: The position of the keyframe.
index 2d4e0a0c092d6912f7bdeeb8949afd7587693c5e..b1a8839110e21c530bcc523522383d2d7b33fd86 100644 (file)
@@ -493,6 +493,7 @@ class Vector:
   def resize4D():
     """
     Resize the vector to 4d. New axis will be 0.0.
+    The last component will be 1.0, to make multiplying 3d vectors by 4x4 matrices easier.
     @return: a copy of itself
     """
 
index f60d84ff02a1032888c29a3e19b1c4352efb7c7e..54fd5d59cf09f1b8ccb75629deb8faf1c2742b8d 100644 (file)
@@ -112,6 +112,11 @@ Example::
        already associated with a group, else it does nothing.\n
        - REPLACE: attempts to replace a weight with the new weight value
        for an already associated vertex/group, else it does nothing. 
+@type SelectModes: readonly dictionary.
+@var SelectModes: The available edit select modes.
+       - VERTEX: vertex select mode.
+       - EDGE: edge select mode.
+       - FACE: face select mode.
 """
 
 AssignModes = {'REPLACE':1}
@@ -135,6 +140,19 @@ def New(name='Mesh'):
   @return: a new Blender mesh.
   """
 
+def Mode(mode=0):
+  """
+  Get and/or set the selection modes for mesh editing.  These are the modes
+  visible in the 3D window when a mesh is in Edit Mode.
+  @type mode: int
+  @param mode: The name of the mesh data object.  See L{SelectModes} for values.
+  Modes can be combined.  If omitted, the selection mode is not changed.
+  @rtype: int
+  @return: the current selection mode.
+  @note: The selection mode is an attribute of the current scene.  If the
+  scene is changed, the selection mode may not be the same.
+  """
+
 class MCol:
   """
   The MCol object
@@ -273,9 +291,9 @@ class MVertSeq:
       l=[(.1,.1,.1),Vector([2,2,.5])]
       me.verts.extend(l)              # add multiple vertices
 
-    @type coords: tuple(s) of floats or vectors
+    @type coords: sequences(s) of floats or vectors
     @param coords: coords can be
-       - a tuple of three floats,
+       - a sequence of three floats,
        - a 3D vector, or
        - a sequence (list or tuple) of either of the above.
     """
@@ -348,12 +366,12 @@ class MEdgeSeq:
       v = me.verts                    # get vertices
       if len(v) >= 6:                 # if there are enough vertices...
         me.edges.extend(v[0],v[1])    #   add a single edge
-        l=[(v[1],v[2],v[3]),(v[0],v[2],v[4],v[5])]
+        l=[(v[1],v[2],v[3]),[v[0],v[2],v[4],v[5]]]
         me.edges.extend(l)            #   add multiple edges
 
-    @type vertseq: tuple(s) of MVerts
+    @type vertseq: sequence(s) of MVerts
     @param vertseq: either two to four MVerts, or sequence (list or tuple) 
-    of tuples each containing two to four MVerts.
+    of sequences each containing two to four MVerts.
     """
 
   def delete(edges):
@@ -442,7 +460,7 @@ class MFace:
      colors; use L{Mesh.faceUV} and L{Mesh.vertexColors} to test.  B{Note}:
      if a mesh has i{both} UV faces and vertex colors, the colors stored in
      the UV faces will be used here. 
-  @type col: list of MCols
+  @type col: sequence of MCols
   @ivar mat: The face's index into the mesh's materials
       list.  It is in the range [0,15].
   @type mat: int
@@ -520,7 +538,7 @@ class MFaceSeq:
   def extend(vertseq):
     """
     Add one or more faces to the mesh.  Faces which already exist in the 
-    mesh are ignored.  Tuples of two vertices are accepted, but no face
+    mesh are ignored.  Sequences of two vertices are accepted, but no face
     will be created.
 
     Example::
@@ -531,12 +549,12 @@ class MFaceSeq:
       v = me.verts                    # get vertices
       if len(v) >= 6:                 # if there are enough vertices...
         me.faces.extend(v[1],v[2],v[3]) #   add a single edge
-        l=[(v[0],v[1]),(v[0],v[2],v[4],v[5])]
+        l=[(v[0],v[1]),[v[0],v[2],v[4],v[5]]]
         me.faces.extend(l)            #   add another face
 
-    @type vertseq: tuple(s) of MVerts
+    @type vertseq: sequence(s) of MVerts
     @param vertseq: either two to four MVerts, or sequence (list or tuple) 
-    of tuples each containing two to four MVerts.
+    of sequences each containing two to four MVerts.
     """
 
   def delete(deledges, faces):
@@ -608,6 +626,9 @@ class Mesh:
     be set.  Furthermore, if vertexColors is already set when faceUV is set,
     vertexColors is cleared.  This is because the vertex color information
     is stored with UV faces, so enabling faceUV implies enabling vertexColors.
+    In addition, faceUV cannot be set when the mesh has no faces defined
+    (this is the same behavior as the UI).  Attempting to do so will throw
+    a RuntimeError exception.
   @type faceUV: bool
   @ivar vertexColors: The mesh contains vertex colors.  See L{faceUV} for the
     use of vertex colors when UV-mapped texture faces are enabled.
@@ -706,11 +727,11 @@ class Mesh:
 
   def findEdges(edges):
     """
-    Quickly search for the location of an edge.  
-    @type edges: tuple(s) of ints or MVerts
+    Quickly search for the location of an edges.  
+    @type edges: sequence(s) of ints or MVerts
     @param edges: can be tuples of MVerts or integer indexes (B{note:} will
        not work with PVerts) or a sequence (list or tuple) containing two or
-       more tuples.
+       more sequences.
     @rtype: int, None or list
     @return: if an edge is found, its index is returned; otherwise None is
     returned.  If a sequence of edges is passed, a list is returned.
@@ -825,6 +846,16 @@ class Mesh:
     associated with the mesh's object
     """
 
+  def getVertexInfluences(index):
+    """
+    Get the bone influences for a specific vertex.
+    @type index: int
+    @param index: The index of a vertex.
+    @rtype: list of lists
+    @return: List of pairs [name, weight], where name is the bone name (string)
+        and weight is a float value.
+    """
+
   def smooth():
     """
     Flattens angle of selected faces. Experimental mesh tool.
index 45d3fb9c90ddc3049d7dc759b46b682d9624e4fc..f51a31e85f23d59a3ce64db40470cfeec2a804cc 100644 (file)
@@ -269,6 +269,19 @@ class Object:
     the type Effect.
     """
 
+  def insertShapeKey():
+    """
+    Insert a Shape Key in the current object.  It applies to Objects of
+    the type Mesh, Lattice, or Curve.
+    """
+
+  def getPose():
+    """
+    Gets the current Pose of the object.
+    @rtype: Pose object
+    @return: the current pose object
+    """
+
   def clearIpo():
     """
     Unlinks the ipo from this object.
index cd5ea2c3036c36b6d55f8bf9125828f9167ed08e..16bdf3f4d84a063e63c5959f75f38051a830221e 100644 (file)
@@ -184,6 +184,10 @@ class ThemeSpace:
   @ivar face_select: theme rgba var.
   @ivar face_dot: theme rgba var.
   @ivar normal: theme rgba var.
+  @ivar bone_solid: theme rgba var.
+  @ivar bon_pose: theme rgba var.
+  @ivar strip: theme rgba var.
+  @ivar strip_select: theme rgba var.
   @ivar syntaxl: theme rgba var.
   @ivar syntaxn: theme rgba var.
   @ivar syntaxb: theme rgba var.
index 647756540549026909ecd08cbbbe36b37e163b48..061ae696f6a09a26d9273fc8d26f40ab95589e97 100644 (file)
@@ -232,7 +232,7 @@ def GetPerspMatrix ():
   @return: the current matrix.
   """
 
-def EditMode(enable = -1, undo_msg = 'From script'):
+def EditMode(enable = -1, undo_msg = 'From script', undo = 1):
   """
   Get and optionally set the current edit mode status: in or out.
 
@@ -258,6 +258,9 @@ def EditMode(enable = -1, undo_msg = 'From script'):
       string is used as the undo message in the Mesh->Undo History submenu in
       the 3d view header.  Max length is 63, strings longer than that get
       clamped.
+  @param undo: don't save Undo information (only needed when exiting edit
+  mode).
+  @type undo: int
   @rtype: int (bool)
   @return: 0 if Blender is not in edit mode right now, 1 otherwise. 
   @warn: this is an important function. NMesh operates on normal Blender
index c66482eab1ce063b4e1ae002dbd8d27b361ddf82..fcf0616b874d65a29a9b562ec575fac821feca1d 100644 (file)
@@ -458,7 +458,7 @@ static int Matrix_ass_item(MatrixObject * self, int i, PyObject * ob)
        float vec[4];
        PyObject *m, *f;
 
-       if(i > self->rowSize || i < 0){
+       if(i >= self->rowSize || i < 0){
                return EXPP_ReturnIntError(PyExc_TypeError,
                        "matrix[attribute] = x: bad row\n");
        }
index bb862fe42f74876ddc4ca73b00f5a3441f86a2a1..d9b656be61f5cdd2b11ef7b064db81b56029f317 100644 (file)
@@ -160,9 +160,9 @@ PyObject *Vector_Resize4D(VectorObject * self)
        self->vec = self->data.py_data;  //force
        if(self->size == 2){
                self->data.py_data[2] = 0.0f;
-               self->data.py_data[3] = 0.0f;
+               self->data.py_data[3] = 1.0f;
        }else if(self->size == 3){
-               self->data.py_data[3] = 0.0f;
+               self->data.py_data[3] = 1.0f;
        }
        self->size = 4;
        return EXPP_incr_ret((PyObject*)self);
index d07323d0ccd9f7bb81ab7f8ce73a30a87839225a..4043c9e0fafe2c808f3817a536419e84b384f411 100644 (file)
@@ -170,6 +170,10 @@ static PyObject *ThemeSpace_getAttr( BPy_ThemeSpace * self, char *name )
                ELSEIF_TSP_RGBA( face_select )
                ELSEIF_TSP_RGBA( face_dot )
                ELSEIF_TSP_RGBA( normal )
+               ELSEIF_TSP_RGBA( bone_solid )
+               ELSEIF_TSP_RGBA( bone_pose )
+               ELSEIF_TSP_RGBA( strip )
+               ELSEIF_TSP_RGBA( strip_select )
                ELSEIF_TSP_RGBA( syntaxl )
                ELSEIF_TSP_RGBA( syntaxn )
                ELSEIF_TSP_RGBA( syntaxb )
@@ -180,14 +184,15 @@ static PyObject *ThemeSpace_getAttr( BPy_ThemeSpace * self, char *name )
                else if( !strcmp( name, "facedot_size" ) )
                attrib = Py_BuildValue( "i", tsp->facedot_size );
        else if( !strcmp( name, "__members__" ) )
-               attrib = Py_BuildValue( "[sssssssssssssssssssssssssssssss]", "theme",
+               attrib = Py_BuildValue("[sssssssssssssssssssssssssssssssssss]", "theme",
                                        "back", "text", "text_hi", "header",
                                        "panel", "shade1", "shade2", "hilite",
                                        "grid", "wire", "lamp", "select", "active",
                                        "transform", "vertex", "vertex_select",
                                        "edge", "edge_select", "edge_seam",
                                        "edge_facesel", "face", "face_select",
-                                       "face_dot", "normal",
+                                       "face_dot", "normal", "bone_solid", "bone_pose",
+                                       "strip", "strip_select",
                                        "syntaxl", "syntaxn", "syntaxb", "syntaxv", "syntaxc",
                                        "vertex_size", "facedot_size" );
 
@@ -230,6 +235,10 @@ static int ThemeSpace_setAttr( BPy_ThemeSpace * self, char *name,
                ELSEIF_TSP_RGBA( face_select )
                ELSEIF_TSP_RGBA( face_dot )
                ELSEIF_TSP_RGBA( normal )
+               ELSEIF_TSP_RGBA( bone_solid )
+               ELSEIF_TSP_RGBA( bone_pose )
+               ELSEIF_TSP_RGBA( strip )
+               ELSEIF_TSP_RGBA( strip_select )
                ELSEIF_TSP_RGBA( syntaxl )
                ELSEIF_TSP_RGBA( syntaxn )
                ELSEIF_TSP_RGBA( syntaxb )
index 34a2ff01eadb064894e3a0715f65e5f8bc85bc25..e3fbb98476123a3900b5fec930401d5b45dfe213 100644 (file)
@@ -1300,7 +1300,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        uiDefButBitS(block, TOG, MOD_MIR_CLIPPING, B_MODIFIER_RECALC, "Do Clipping",    lx+60, cy, buttonWidth-60,19, &mmd->flag, 1, 2, 0, 0, "Prevents during Transform vertices to go through Mirror");
                } else if (md->type==eModifierType_Decimate) {
                        DecimateModifierData *dmd = (DecimateModifierData*) md;
-                       uiDefButF(block, NUM, B_MODIFIER_RECALC, "Percent:",    lx,(cy-=19),buttonWidth,19, &dmd->percent, 0.0, 1.0, 10, 0, "Defines the percentage of triangles to reduce to");
+                       uiDefButF(block, NUM, B_MODIFIER_RECALC, "Ratio:",      lx,(cy-=19),buttonWidth,19, &dmd->percent, 0.0, 1.0, 10, 0, "Defines the percentage of triangles to reduce to");
                        sprintf(str, "Face Count: %d", dmd->faceCount);
                        uiDefBut(block, LABEL, 1, str,  lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "Displays the current number of faces in the decimated mesh");
                } else if (md->type==eModifierType_Wave) {
index d26ade8b56195b39f514a69b12a5dcadb052ec38..d4f4d182b8fc78cc8d139f051c31d79e9a3fb292 100644 (file)
@@ -2438,7 +2438,7 @@ void buttons_ketsji(uiBlock *block, Object *ob)
                                &ob->gameflag, 0, 0,0, 0,
                                "Specify a bounds object for physics");
                if (ob->gameflag & OB_BOUNDS) {
-                       uiDefButS(block, MENU, REDRAWVIEW3D, "Boundary Display%t|Box%x0|Sphere%x1|Cylinder%x2|Cone%x3|Concave Mesh %x4|Convex Polytope%x5",
+                       uiDefButS(block, MENU, REDRAWVIEW3D, "Boundary Display%t|Box%x0|Sphere%x1|Cylinder%x2|Cone%x3|Convex Hull Polytope%x5|Static TriangleMesh %x4|",
                                85, 125, 140, 19, &ob->boundtype, 0, 0, 0, 0, "Selects the collision type");
                }
        }
index c06108e1e16474245ad0b46e092413594fa9d049..153b304079e98993eb864bece845ab11d25ab515 100644 (file)
@@ -825,16 +825,34 @@ void drawseqspace(ScrArea *sa, void *spacedata)
 
        if(ed) {
                seq= ed->seqbasep->first;
-               while(seq) {
-                       if(seq->flag & SELECT); else drawseq(seq);
+               while(seq) { /* bound box test, dont draw outside the view */
+                       if (seq->flag & SELECT ||
+                                       seq->start > G.v2d->cur.xmax ||
+                                       seq->start+seq->len < G.v2d->cur.xmin ||
+                                       seq->machine+1.0 < G.v2d->cur.ymin ||
+                                       seq->machine > G.v2d->cur.ymax)
+                       {
+                               /* dont draw */
+                       } else {
+                               drawseq(seq);
+                       }
                        seq= seq->next;
                }
        }
        ed= G.scene->ed;
        if(ed) {
                seq= ed->seqbasep->first;
-               while(seq) {
-                       if(seq->flag & SELECT) drawseq(seq);
+               while(seq) { /* bound box test, dont draw outside the view */
+                       if (!(seq->flag & SELECT) ||
+                                       seq->start > G.v2d->cur.xmax ||
+                                       seq->start+seq->len < G.v2d->cur.xmin ||
+                                       seq->machine+1.0 < G.v2d->cur.ymin ||
+                                       seq->machine > G.v2d->cur.ymax)
+                       {
+                               /* dont draw */
+                       } else {
+                               drawseq(seq);
+                       }
                        seq= seq->next;
                }
        }
index dd0bc08244c33a3b13fdaec1875a54aa3853e258..adf3aacf9c4aad17f8b50177245c14f1e5930848 100644 (file)
@@ -64,8 +64,7 @@ void drawsoundspace(ScrArea *sa, void *spacedata);
 static void draw_wave(int startsamp, int endsamp, short sampdx, short offset, short *sp, float sampfac, float y)
 {
        float min, max, v1[2], v2[3];
-       int i, j;
-       short value, deltasp;
+       int i, j, deltasp, value; /*deltasp, value: were both shorts but for music files 5min, zooming out cased a crash */
        
        sp+= offset*startsamp;
 
index 2b4a3e869f8548c5a0ca510047cc8d1df06ee1a3..8b1f96e35690e25d35f32337e89e5f0cf11123ff 100644 (file)
@@ -335,6 +335,7 @@ void transform_oops(int mode, int context)
                        if(val) {
                                switch(event) {
                                case ESCKEY:
+                               case RIGHTMOUSE:
                                case LEFTMOUSE:
                                case SPACEKEY:
                                case RETKEY:
@@ -358,7 +359,7 @@ void transform_oops(int mode, int context)
                }
        }
        
-       if(event==ESCKEY) {
+       if(event==ESCKEY || event==RIGHTMOUSE) {
                tv= transmain;
                for(a=0; a<tot; a++, tv++) {
                        tv->loc[0]= tv->oldloc[0];
index 07d85d481607049d13efe14316af6e394394c286..e4cfb8338957368a0d672a403b7d6d7066aff2ae 100644 (file)
@@ -1111,15 +1111,22 @@ void drawfilespace(ScrArea *sa, void *spacedata)
        }
        else loadbutton= 0;
 
-       uiDefBut(block, TEX,1,"",       textrct.xmin, filebuty1, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
-       uiDefBut(block, TEX,2,"",       textrct.xmin, filebuty2, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
-
+       uiBlockBeginAlign(block);
+       uiDefBut(block, TEX,2,"",       textrct.xmin, filebuty2, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
        if(loadbutton) {
                uiSetCurFont(block, UI_HELV);
                uiDefBut(block, BUT,        5, sfile->title,    textrct.xmax-loadbutton, filebuty2, loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+       }
+       uiBlockEndAlign(block);
+       
+       uiBlockBeginAlign(block);
+       uiDefBut(block, TEX,1,"",       textrct.xmin, filebuty1, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "File, increment version number with (+/-)"); /* File input */
+       if(loadbutton) {
+               uiSetCurFont(block, UI_HELV);
                uiDefBut(block, BUT,        6, "Cancel",        textrct.xmax-loadbutton, filebuty1, loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
        }
-
+       uiBlockEndAlign(block);
+       
        menu= fsmenu_build_menu();
        if(menu[0])     // happens when no .Bfs is there, and first time browse
                uiDefButS(block, MENU,  3, menu, scrollrct.xmin, filebuty1, scrollrct.xmax-scrollrct.xmin, 21, &sfile->menu, 0, 0, 0, 0, "");
index 3cf07f7bae2f097d9620c26989357f3944cb20e5..62725f33f8a36a0baee44365eba2e8cca1143d5c 100644 (file)
@@ -128,9 +128,11 @@ void file_buttons(void)
        BIF_DrawString(uiBlockGetCurFont(block), sfile->title, (U.transopts & USER_TR_BUTTONS));
        xco+= BIF_GetStringWidth(G.font, sfile->title, (U.transopts & USER_TR_BUTTONS));
        
+       uiBlockBeginAlign(block);
        uiDefIconButBitS(block, ICONTOG, FILE_SHOWSHORT, B_SORTFILELIST, ICON_LONGDISPLAY,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Toggles long info");
        uiDefIconButBitS(block, TOG, FILE_HIDE_DOT, B_RELOADDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Hides dot files");
-
+       uiBlockEndAlign(block);
+       
        uiDefButBitS(block, TOG, FILE_STRINGCODE, 0, "Relative Paths", xco+=XIC+20,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Makes sure returned paths are relative to the current .blend file");
 
        xco+=90;
index 68e47a97420598af16cf00e1f69153cef51bfc55..c99112248b74a3e99db5268b27925464e3c40ece 100644 (file)
@@ -125,12 +125,15 @@ void imasel_buttons(void)
                xco+=BMF_GetStringWidth(G.fonts, simasel->title);
                xco+=25;
        }
+       
+       uiBlockBeginAlign(block);
        uiDefIconBut(block, BUT, B_IMASELREMOVEBIP, ICON_BPIBFOLDER_X, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");/* remove  */
        
        uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_BPIBFOLDERGREY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of directory information");/* dir         */
        uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_INFO, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of selected image information");/* info  */
        uiDefIconButS(block, TOG|BIT|2, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* image */
        uiDefIconButS(block, TOG|BIT|3, B_REDR, ICON_MAGNIFY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles magnified view of thumbnail of images under mouse pointer");/* magnify */
+       uiBlockEndAlign(block);
        
        /* always do as last */
        curarea->headbutlen= xco+2*XIC;
index 36334a7d2952d506e785a559a27be145ce2eb2c6..ea02e03b8bdf20a8ad9fa4e0e7b45ae10fb653be 100644 (file)
@@ -1183,6 +1183,7 @@ void ipo_buttons(void)
 
        /* COPY PASTE */
        xco-= XIC/2;
+       uiBlockBeginAlign(block);
        if(curarea->headertype==HEADERTOP) {
                uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYUP,        xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer");
                uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data");
@@ -1193,15 +1194,19 @@ void ipo_buttons(void)
                uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data");
                uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN,    xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
        }
+       uiBlockEndAlign(block);
        xco+=XIC/2;
        
        uiClearButLock();
+
        /* ZOOMBORDER */
        uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE,  xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to area");
        
+       xco+=XIC/2;
+       
        /* draw LOCK */
        uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.sipo->lock), 0, 0, 0, 0, "Toggles forced redraw of other windows to reflect changes in real time");
-
+       
        /* always do as last */
        curarea->headbutlen= xco+2*XIC;
 
index a3f068dc5a5f47222d00e0e3912adb8dffa3df6b..f84cee782d7ac1bb70f589f5a9e8b3525a9b56b7 100644 (file)
@@ -72,26 +72,55 @@ void do_oops_buttons(short event)
 {
        float dx, dy;
        
+       /* used for maximize hack */
+       int win_width, win_height; 
+       float aspect_win, aspect_oops, oops_width, oops_height, oops_x_mid, oops_y_mid;
+       
+       
        if(curarea->win==0) return;
-
-       switch(event) {
-       case B_OOPSHOME:
-               init_v2d_oops(curarea, curarea->spacedata.first);       // forces min/max to be reset
-               boundbox_oops(0);
-               G.v2d->cur= G.v2d->tot;
-               dx= 0.15*(G.v2d->cur.xmax-G.v2d->cur.xmin);
-               dy= 0.15*(G.v2d->cur.ymax-G.v2d->cur.ymin);
-               G.v2d->cur.xmin-= dx;
-               G.v2d->cur.xmax+= dx;
-               G.v2d->cur.ymin-= dy;
-               G.v2d->cur.ymax+= dy;           
-               test_view2d(G.v2d, curarea->winx, curarea->winy);
-               scrarea_queue_winredraw(curarea);
-               break;
        
-       case B_OOPSVIEWSEL:
+       if (event == B_NEWOOPS) {
+               scrarea_queue_winredraw(curarea);
+               scrarea_queue_headredraw(curarea);
+               G.soops->lockpoin= 0;
+       } else { /* must be either B_OOPSHOME or B_OOPSVIEWSEL */
                init_v2d_oops(curarea, curarea->spacedata.first);       // forces min/max to be reset
-               boundbox_oops(1);
+               if (event == B_OOPSHOME) {
+                       boundbox_oops(0); /* Test all oops blocks */
+               } else {
+                       boundbox_oops(1); /* Test only selected oops blocks */
+               }
+               
+               
+               /* Hack to work with test_view2d in drawipo.c
+               Modify the bounding box so it is maximized to the window aspect
+               so viewing all oops blocks isnt limited to hoz/vert only.
+               Cant modify drawipo.c because many other functions use this hos/vert operation - Campbell*/
+               
+               win_width= curarea->winrct.xmax - curarea->winrct.xmin;
+               win_height= curarea->winrct.ymax - curarea->winrct.ymin;
+               
+               oops_width = G.v2d->tot.xmax - G.v2d->tot.xmin;
+               oops_height = G.v2d->tot.ymax - G.v2d->tot.ymin;
+               
+               oops_x_mid = (G.v2d->tot.xmax + G.v2d->tot.xmin)*0.5;
+               oops_y_mid = (G.v2d->tot.ymax + G.v2d->tot.ymin)*0.5;
+               /* wide windows will be above 1, skinny below 1 */
+               aspect_win= (float)win_width / (float)win_height; 
+               aspect_oops = (float)oops_width / (float)oops_height; 
+               if (aspect_win>aspect_oops) {/* the window is wider then the oops bounds, increase the oops width */
+                       G.v2d->tot.xmin = oops_x_mid - ((oops_x_mid-G.v2d->tot.xmin) * (aspect_win/aspect_oops) ); /* scale the min */
+                       G.v2d->tot.xmax = oops_x_mid + ((G.v2d->tot.xmax-oops_x_mid) * (aspect_win/aspect_oops) );/* scale the max */
+               } else { /* the window is skinnier then the oops bounds, increase the oops height */
+                       G.v2d->tot.ymin = oops_y_mid - ((oops_y_mid-G.v2d->tot.ymin) * (aspect_oops/aspect_win) ); /* scale the min */
+                       G.v2d->tot.ymax = oops_y_mid + ((G.v2d->tot.ymax-oops_y_mid) * (aspect_oops/aspect_win) );/* scale the max */
+               }
+               
+               /* maybe we should restore the correct values? - do next of its needed */
+               /* end hack */
+               
+               
+               
                G.v2d->cur= G.v2d->tot;
                dx= 0.15*(G.v2d->cur.xmax-G.v2d->cur.xmin);
                dy= 0.15*(G.v2d->cur.ymax-G.v2d->cur.ymin);
@@ -101,13 +130,6 @@ void do_oops_buttons(short event)
                G.v2d->cur.ymax+= dy;           
                test_view2d(G.v2d, curarea->winx, curarea->winy);
                scrarea_queue_winredraw(curarea);
-               break;
-       
-       case B_NEWOOPS:
-               scrarea_queue_winredraw(curarea);
-               scrarea_queue_headredraw(curarea);
-               G.soops->lockpoin= 0;
-               break;
        }
 }
 
index 1c6a9cb516b00764916ef81cd1351901ce784514..cb1f89d465f1ef479b5baacd58a360359f9a24eb 100644 (file)
@@ -251,7 +251,8 @@ void script_buttons(void)
        }
 
        uiBlockSetEmboss(block, UI_EMBOSS);
-
+       
+       uiBlockBeginAlign(block);
        uiDefIconBut(block, BUT, B_SCRIPT2PREV, ICON_GO_LEFT, xco+=XIC, 0, XIC, YIC,
                0, 0, 0, 0, 0, "Returns to previous window");
 
@@ -262,7 +263,8 @@ void script_buttons(void)
        else
                uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN,        xco+=XIC,0,XIC,YIC, 0, 0,
                                0, 0, 0, "Makes current window full screen (CTRL+Down arrow)");
-
+       uiBlockEndAlign(block);
+       
        /* STD SCRIPT BUTTONS */
        xco += 2*XIC;
        xco= std_libbuttons(block, xco, 0, 0, NULL, B_SCRIPTBROWSE, ID_SCRIPT, 0, (ID*)sc->script, 0, &(sc->menunr), 0, 0, 0, 0, 0);
index cd65317145b3b409cfc99cc1e8a5e87a92d6abc4..444beda38e8b7413bf826d9fc6e7f9dc00fbae23 100644 (file)
@@ -484,8 +484,10 @@ void seq_buttons()
 
        /* ZOOM and BORDER */
        xco+= 8;
+       uiBlockBeginAlign(block);
        uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM,  xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view in and out (Ctrl MiddleMouse)");
        uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE,  xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area");
+       uiBlockEndAlign(block);
 
        /* CLEAR MEM */
        xco+= 8;
index 0438eda08fae1be683597a51978ba4e88317207f..9a6236bb3f72df39b53b6f2547e5a209774f9533 100644 (file)
@@ -613,13 +613,15 @@ void text_buttons(void)
        xco += 10;
        
        /* FULL WINDOW */
+       uiBlockBeginAlign(block);
        if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN,     xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Returns to multiple views window (CTRL+Up arrow)");
        else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN,   xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Makes current window full screen (CTRL+Down arrow)");
                
        uiDefIconButI(block, ICONTOG, B_TEXTLINENUM, ICON_LONGDISPLAY, xco+=XIC,0,XIC,YIC, &st->showlinenrs, 0, 0, 0, 0, "Displays line numbers");
 
        uiDefIconButI(block, ICONTOG, B_SYNTAX, ICON_SYNTAX, xco+=XIC,0,XIC,YIC, &st->showsyntax, 0, 0, 0, 0, "Enables Syntax Highlighting");
-
+       uiBlockEndAlign(block);
+       
        /* STD TEXT BUTTONS */
        xco+= 2*XIC;
        xco= std_libbuttons(block, xco, 0, 0, NULL, B_TEXTBROWSE, ID_TXT, 0, (ID*)st->text, 0, &(st->menunr), 0, 0, B_TEXTDELETE, 0, 0);
index bf4d0e83e26508e753aa077394bcd10dc9896d64..e8598bd265f6930deb2e3ba6d686f6df81964ebc 100644 (file)
@@ -4432,6 +4432,7 @@ void view3d_buttons(void)
        
        if (ob && (ob->flag & OB_POSEMODE)) {
                xco+= XIC/2;
+               uiBlockBeginAlign(block);
                if(curarea->headertype==HEADERTOP) {
                        uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYUP, 
                                                 xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, 
@@ -4456,6 +4457,7 @@ void view3d_buttons(void)
                                                 xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, 
                                                 "Pastes the mirrored pose from the buffer");
                }
+               uiBlockEndAlign(block);
        }
 
        /* Always do this last */
index 5c02db94fd8acd60828080fe31234077dfc92efa..3d534744ed32f89ec012390455e4b7f90b09a578 100644 (file)
@@ -5364,7 +5364,7 @@ void uiBlockEndAlign(uiBlock *block)
        uiBut *prev, *but=NULL, *next;
        int flag= 0, cols=0, rows=0;
        
-       if ( !((BIF_GetThemeValue(TH_BUT_DRAWTYPE) == 1) || (BIF_GetThemeValue(TH_BUT_DRAWTYPE) == 2))) {
+       if ( !((BIF_GetThemeValue(TH_BUT_DRAWTYPE) == 0) || (BIF_GetThemeValue(TH_BUT_DRAWTYPE) == 1) || (BIF_GetThemeValue(TH_BUT_DRAWTYPE) == 2))) {
                block->flag &= ~UI_BUT_ALIGN;   // all 4 flags
                return;
        }
index d910a394e618ba4823fffe13123d2b97c74791d2..450181a1e9959170a902cdae16cc0d590dadad8f 100644 (file)
@@ -1207,12 +1207,18 @@ static void ui_draw_round(int type, int colorid, float asp, float x1, float y1,
 /* super minimal button as used in logic menu */
 static void ui_draw_minimal(int type, int colorid, float asp, float x1, float y1, float x2, float y2, int flag)
 {
-       
+       /* too much space between buttons */
+       /* 
        x1+= asp;
        x2-= asp;
        y1+= asp;
        y2-= asp;
-
+       */
+       
+       /* Less space between buttons looks nicer */
+       y2-= asp;
+       x2-= asp;
+       
        /* paper */
        if(flag & UI_SELECT) {
                if(flag & UI_ACTIVE) BIF_ThemeColorShade(colorid, -40);
@@ -1744,6 +1750,15 @@ static void ui_draw_but_CHARTAB(uiBut *but)
        unsigned char ustr[16];
        PackedFile *pf;
        int result = 0;
+       int charmax = G.charmax;
+
+       /* <builtin> font in use */
+       if(!strcmp(G.selfont->name, "<builtin>"))
+               charmax = 0xff;
+
+       /* Category list exited without selecting the area */
+       if(G.charmax == 0)
+               charmax = G.charmax = 0xffff;
 
        /* Calculate the size of the button */
        width = abs(but->x2 - but->x1);
@@ -1777,7 +1792,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
 
                        strcpy(tmpStr, G.selfont->name);
                        BLI_convertstringcode(tmpStr, G.sce, 0);
-                       err = FTF_SetFont(tmpStr, 0, 14.0);
+                       err = FTF_SetFont((unsigned char *)tmpStr, 0, 14.0);
                }
        }
 
@@ -1791,12 +1806,12 @@ static void ui_draw_but_CHARTAB(uiBut *but)
        for(y = 0; y < 6; y++)
        {
                // Do not draw more than the category allows
-               if(cs > G.charmax) break;
+               if(cs > charmax) break;
 
                for(x = 0; x < 12; x++)
                {
                        // Do not draw more than the category allows
-                       if(cs > G.charmax) break;
+                       if(cs > charmax) break;
 
                        // Draw one grid cell
                        glBegin(GL_LINE_LOOP);
@@ -1809,9 +1824,18 @@ static void ui_draw_but_CHARTAB(uiBut *but)
                        // Draw character inside the cell
                        memset(wstr, 0, sizeof(wchar_t)*2);
                        memset(ustr, 0, 16);
-                       
+
+                       // Set the font to be either unicode or <builtin>                               
                        wstr[0] = cs;
-                       wcs2utf8s(ustr, wstr);
+                       if(strcmp(G.selfont->name, "<builtin>"))
+                       {
+                               wcs2utf8s((char *)ustr, (wchar_t *)wstr);
+                       }
+                       else
+                       {
+                               ustr[0] = cs;
+                               ustr[1] = 0;
+                       }
 
                        if(G.selfont && strcmp(G.selfont->name, "<builtin>"))
                        {
@@ -1821,8 +1845,8 @@ static void ui_draw_but_CHARTAB(uiBut *but)
                                float px, py;
        
                                // Calculate the position
-                               wid = FTF_GetStringWidth(ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
-                               FTF_GetBoundingBox(ustr, &llx,&lly,&llz,&urx,&ury,&urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+                               wid = FTF_GetStringWidth((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+                               FTF_GetBoundingBox((char *) ustr, &llx,&lly,&llz,&urx,&ury,&urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
                                dx = urx-llx;
                                dy = ury-lly;
 
@@ -1832,12 +1856,12 @@ static void ui_draw_but_CHARTAB(uiBut *but)
 
                                // Set the position and draw the character
                                ui_rasterpos_safe(px, py, but->aspect);
-                               FTF_DrawString(ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+                               FTF_DrawString((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
                        }
                        else
                        {
                                ui_rasterpos_safe(sx + butw/2, sy + buth/2, but->aspect);
-                               BIF_DrawString(but->font, ustr, 0);
+                               BIF_DrawString(but->font, (char *) ustr, 0);
                        }
        
                        // Calculate the next position and character
@@ -1855,16 +1879,16 @@ static void ui_draw_but_CHARTAB(uiBut *but)
        /* Return Font Settings to original */
        if(U.fontsize && U.fontname[0])
        {
-               result = FTF_SetFont(U.fontname, 0, U.fontsize);
+               result = FTF_SetFont((unsigned char *)U.fontname, 0, U.fontsize);
        }
        else if (U.fontsize)
        {
-               result = FTF_SetFont(datatoc_bfont_ttf, datatoc_bfont_ttf_size, U.fontsize);
+               result = FTF_SetFont((unsigned char *) datatoc_bfont_ttf, datatoc_bfont_ttf_size, U.fontsize);
        }
 
        if (result == 0)
        {
-               result = FTF_SetFont(datatoc_bfont_ttf, datatoc_bfont_ttf_size, 11);
+               result = FTF_SetFont((unsigned char *) datatoc_bfont_ttf, datatoc_bfont_ttf_size, 11);
        }
 }
 
index 4b5b7ceedf76fc2f95ca9fb865520688cea8ee32..921048ff3b0955ea4b5511b62f79926d89eb3cfc 100644 (file)
@@ -1012,9 +1012,16 @@ void BIF_do_render(int anim)
        /* if start render in 3d win, use layer from window (e.g also local view) */
        if(curarea && curarea->spacetype==SPACE_VIEW3D) {
                int lay= G.scene->lay;
-               if(G.vd->lay & 0xFF000000)      // localview
-                       G.scene->lay |= G.vd->lay;
-               else G.scene->lay= G.vd->lay;
+               /*
+                * if view is defined (might not be if called form script), check
+                * and set layers
+                */
+               if(G.vd) {
+                       if(G.vd->lay & 0xFF000000)      // localview
+                               G.scene->lay |= G.vd->lay;
+                       else
+                               G.scene->lay= G.vd->lay;
+               }
                
                do_render(anim);
                
index 582a0e1f037492106e013bf0b1d5394135cd76e5..4faa1a4a035e8bfa2a80f7689a7ca5c0e34d9a96 100644 (file)
@@ -3018,6 +3018,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
        } else if(U.userpref == 5) { /* file paths */
 
                /* yafray: (temporary) path button for yafray xml export, now with fileselect */
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "YFexport: ",
                        (xpos+edgsp), y2+buth+rspace, lpref-smfileselbut, buth,
                        U.yfexportdir, 1.0, 63.0, 0, 0,
@@ -3025,7 +3026,9 @@ void drawinfospace(ScrArea *sa, void *spacedata)
                uiDefIconBut(block, BUT, B_YAFRAYDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+lpref-smfileselbut), y2+buth+rspace, smfileselbut, buth,
                        0, 0, 0, 0, 0, "Select the default yafray export directory");
-
+               uiBlockEndAlign(block);
+               
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Fonts: ",
                        (xpos+edgsp),y2,(lpref-smfileselbut),buth,
                        U.fontdir, 1.0, 63.0, 0, 0,
@@ -3033,37 +3036,47 @@ void drawinfospace(ScrArea *sa, void *spacedata)
                uiDefIconBut(block, BUT, B_FONTDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+lpref-smfileselbut),y2,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default font directory");
-
+               uiBlockEndAlign(block);
+               
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Textures: ",
                        (xpos+edgsp+lpref+midsp),y2,(lpref-smfileselbut),buth,
                        U.textudir, 1.0, 63.0, 0, 0, "The default directory to search for textures");
                uiDefIconBut(block, BUT, B_TEXTUDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(2*lpref)+midsp-smfileselbut),y2,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default texture location");
+               uiBlockEndAlign(block);
 
-
+               
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Tex Plugins: ",
                        (xpos+edgsp+(2*lpref)+(2*midsp)),y2,(lpref-smfileselbut),buth,
                        U.plugtexdir, 1.0, 63.0, 0, 0, "The default directory to search for texture plugins");
                uiDefIconBut(block, BUT, B_PLUGTEXDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(3*lpref)+(2*midsp)-smfileselbut),y2,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default texture plugin location");
-
+               uiBlockEndAlign(block);
+               
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Seq Plugins: ",
                        (xpos+edgsp+(3*lpref)+(3*midsp)),y2,(lpref-smfileselbut),buth,
                        U.plugseqdir, 1.0, 63.0, 0, 0, "The default directory to search for sequence plugins");
                uiDefIconBut(block, BUT, B_PLUGSEQDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(4*lpref)+(3*midsp)-smfileselbut),y2,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default sequence plugin location");
+               uiBlockEndAlign(block);
 
-
+               
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Render: ",
                        (xpos+edgsp),y1,(lpref-smfileselbut),buth,
                        U.renderdir, 1.0, 63.0, 0, 0, "The default directory for rendering output");
                uiDefIconBut(block, BUT, B_RENDERDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+lpref-smfileselbut),y1,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default render output location");
+               uiBlockEndAlign(block);
 
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Python: ",
                        (xpos+edgsp+lpref+midsp),y1,(lpref-2*smfileselbut),buth,
                        U.pythondir, 1.0, 63.0, 0, 0, "The default directory to search for Python scripts");
@@ -3073,21 +3086,26 @@ void drawinfospace(ScrArea *sa, void *spacedata)
                uiDefIconBut(block, BUT, B_PYTHONDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(2*lpref)+midsp-smfileselbut),y1,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default Python script location");
+               uiBlockEndAlign(block);
 
 
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Sounds: ",
                        (xpos+edgsp+(2*lpref)+(2*midsp)),y1,(lpref-smfileselbut),buth,
                        U.sounddir, 1.0, 63.0, 0, 0, "The default directory to search for sounds");
                uiDefIconBut(block, BUT, B_SOUNDDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(3*lpref)+(2*midsp)-smfileselbut),y1,smfileselbut,buth,
-                       0, 0, 0, 0, 0, "Select the default sound location");
+                       0, 0, 0, 0, 0, "Selet the default sound location");
+               uiBlockEndAlign(block);
 
+               uiBlockBeginAlign(block);
                uiDefBut(block, TEX, 0, "Temp: ",
                         (xpos+edgsp+(3*lpref)+(3*midsp)),y1,(lpref-smfileselbut),buth,
                         U.tempdir, 1.0, 63.0, 0, 0, "The directory for storing temporary save files");
                uiDefIconBut(block, BUT, B_TEMPDIRFILESEL, ICON_FILESEL,
                        (xpos+edgsp+(4*lpref)+(3*midsp)-smfileselbut),y1,smfileselbut,buth,
                        0, 0, 0, 0, 0, "Select the default temporary save file location");
+               uiBlockEndAlign(block);
 
        }
 
index d96a7c4b1e5b1dd32364f2617161fb2cf3ebc82b..25cd33bae6070c1f6410310ceaf59564948341ed 100644 (file)
 /* DataToC output of file <splash_jpg> */
 
-int datatoc_splash_jpg_size= 43191;
+int datatoc_splash_jpg_size= 76484;
 char datatoc_splash_jpg[]= {
-255,216,255,224,  0, 16, 74, 70, 73, 70,  0,  1,  2,  0,  0,100,  0,100,  0,  0,255,236,  0,
- 17, 68,117, 99,107,121,  0,  1,  0,  4,  0,  0,  0, 70,  0,  0,255,238,  0, 14, 65,100,111, 98,101,  0,100,192,  0,  0,  0,  1,
-255,219,  0,132,  0,  4,  3,  3,  3,  3,  3,  4,  3,  3,  4,  6,  4,  3,  4,  6,  7,  5,  4,  4,  5,  7,  8,  6,  6,  7,  6,  6,
-  8, 10,  8,  9,  9,  9,  9,  8, 10, 10, 12, 12, 12, 12, 12, 10, 12, 12, 13, 13, 12, 12, 17, 17, 17, 17, 17, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20,  1,  4,  5,  5,  8,  7,  8, 15, 10, 10, 15, 20, 14, 14, 14, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,255,192,  0, 17,  8,  1, 15,  1,245,  3,  1, 17,  0,  2, 17,  1,  3, 17,  1,255,196,  0,219,  0,  0,  0,
-  7,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  1,  0,  1,  5,  1,  1,  1,  0,
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8, 16,  0,  1,  3,  3,  3,  1,  5,  4,  6,  5,  7,  7,  4,
- 10, 19,  0,  1,  2,  3,  4,  0, 17,  5, 33, 18,  6, 49, 65, 81, 34, 19,  7, 97,113, 20,  8,129,145,161, 50,228, 21, 66, 82, 35,
-165, 24,177,193, 98,114,130, 51,102,209,225, 67, 36, 22, 70,  9,240,241,146, 86,210, 99,131,147,164, 37,101,133, 54, 87,178, 83,
-115,179, 52, 84,100,212, 53, 85,117,149,181,197, 38, 23, 71,103, 25, 17,  0,  2,  1,  2,  4,  2,  4, 12,  5,  3,  3,  3,  2,  6,
-  3,  0,  0,  1,  2, 17,  3, 33, 18,  4,  5, 49, 65, 81, 97, 34, 19,240,113,129,145,161,177,193,209,225, 50,162,226, 99, 20, 21,
-  6, 22, 66, 98, 35,241, 82, 51,114,130,146,210, 67,178,194, 83, 36, 68, 53,163, 52,  7,255,218,  0, 12,  3,  1,  0,  2, 17,  3,
- 17,  0, 63,  0,247,245,  0, 10,  0, 20,  0, 40,  0, 80,  5, 44,190, 91,199, 32,228,147,136,149,144,109,188,130,200,  1,147,125,
-  9,232, 20,160, 54,131,236, 38,168, 92,220, 52,240,185,221,202,105, 75,163,195,  3, 66,222,221,168,185,107,189,140, 27,143, 79,
-134, 37,200, 33, 66,224,220, 85,243, 60, 58,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,
-  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,
-  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,
-  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160, 14, 53,234, 47,
-167,115, 12,169, 60,131, 14, 21, 33, 47, 40,187, 42, 55, 85,164,158,170, 71,120,246, 87,  7,188,236,147,114,119,173, 99, 92, 92,
-121,249, 61,199,125,178,239,144, 81, 86,110,225, 76, 20,185,121,125,229, 87, 13,245, 54,126,  4,163, 29,152,221, 43, 24,147,180,
- 44,234,243, 35,167,111,222,  3,186,169,109,155,244,236, 82,221,238,212,122,121,175,121,123,116,216, 33,168,173,203, 61,153,244,
-114,126,227,183,227,178, 80,178,209, 91,155,  1,228,191, 29,193,116,173,  6,227,252,198,189, 18,213,232, 93,138,148, 29, 83, 60,
-226,245,153,218,147,132,213, 26, 37,212,164, 64,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,
-  5,  0, 10,  0, 20,  0, 40,  0, 80,  5, 15, 39,230,188, 75,134, 71, 68,174, 85,153,137,137,105,221, 25, 18, 93, 74, 22,225, 29,
-118, 35,239, 42,221,187, 65,169,237, 88,185,117,210,  9,178, 11,218,139,118, 85,103, 37, 19, 49,138,245,227,210, 12,204,148,195,
-131,203,160,252, 66,200, 74, 19, 33, 75,138, 20,163,208,  5, 62,150,193, 39,223, 86, 39,183,234, 32,170,224,253,126,162,172, 55,
- 45, 52,221, 20,215,171,214,116, 68,173, 43, 72, 90,  8, 82, 72,184, 35, 80, 65,170,  6,136,116,  0, 40,  2,187, 53,158,194,241,
-200, 67, 35,158,200, 71,198,193, 46, 33,144,252,167, 18,210, 11,174, 27, 37,  0,168,139,168,246,  1, 82, 66,220,166,233, 21, 86,
- 71,114,236, 45,170,201,164,186,203,  0, 65, 23, 26,138,140,144,170,228, 60,163,142,241, 56,  7, 39,201,114,145,177, 80, 65,218,
- 30,150,234, 90, 10, 87,234,164, 19,117, 43,216,155,154,150,221,169,220,116,138,109,144,221,189, 11, 74,179,106, 43,172,201, 98,
- 61,118,244,143, 57, 49, 48, 49,220,178,  9,148,178, 18,218, 31, 82,226,133, 40,244,  9, 83,233,109, 36,158,192, 13, 90,158,223,
-168,130,171,131,245,250,138,150,247, 45, 52,221, 20,213,124,222,179,161, 37, 73, 80, 10, 73,  4, 30,132, 85,  3, 68, 58,  0, 20,
-  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,
-  0, 80,  0,160,  1, 64, 16,164,101, 34, 71,116,198,186,158,150,  0, 38, 59,  8, 83,174,  0,122, 21,  4,131,180, 27,245, 85,168,
-  2, 43,252,129,152,107, 97, 51,225,201,139,241, 42,242,216,220,150,221, 43,114,196,237,  9, 97,110, 42,250,126,173,168,  1,255,
-  0,204,222, 32, 41,172,108,183,  1, 23,232,211,103,234,113,212, 26,  0,122, 36,248,211,119,165,149, 20,188,221,188,214, 28, 73,
- 67,168,191, 77,200, 85,136,191, 97,232,123, 40,  2, 85,  0, 10,  0, 20,  0, 40,  2,143,151,187,154,103,143,204, 95, 31, 73, 86,
- 79,104, 13,237,177, 88, 73, 62, 34,144,127, 74,221, 43, 59,113,119,149,137,119, 63, 63,135,  3, 71,110, 86, 30,162, 61,247,201,
-225,199,168,225, 42, 30,161,173, 68,168,229, 10,201,241, 92,189,214,188,235,187,220,223, 43,159, 81,233, 29,230,216,185,219,250,
- 72,115,114, 28,195, 29,179,227,229, 78,141,190,251,  3,174, 56,130,109,221,115, 85,175, 92,214,217,167,120,231, 26,244,182, 89,
-177,107, 67,122,189,218,132,169,208,145, 21, 60,135,144,172,132,167, 37, 45, 74, 61,  0,121,194, 79,219, 85,214,183, 82,221, 20,
-229,231,101,135,161,211, 37, 87,  8,249,144, 23,131,207,190, 21, 41,112, 36,172, 44,238, 83,165,181,155,147,218, 77,169,210,208,
-234,165,219,112,147,235,163, 27, 29,126,150, 61,133, 56,174,170,162, 95, 28,229, 57,158, 37, 48,185, 17, 68, 52, 79,250,196, 55,
- 46, 16,187,119,142,195,237,169,116, 59,133,237, 20,251, 60, 57,197,145,107,182,235, 58,216,118,184,242,146, 59,239, 22,229,216,
-206, 85, 15,226, 33,171,100,132, 88, 72,140,191,190,133, 31,229, 29,198,189, 63, 65,184, 90,213,195, 52, 56,243, 92,209,229,218,
-253,190,238,142,121,103,195,147,228,198,185,119, 63,226, 60, 16, 65, 95, 44,201, 35, 24,214, 69,197, 51, 21,215, 82,178,217, 90,
-  0, 81, 10, 82, 65,  9,208,245, 85,108,217,211,220,189, 92,138,180, 49, 47,234,109,217,166,119, 74,151, 88,204,166, 59, 51,  5,
-140,158, 38, 83,115, 49,242, 82, 28,143, 37,133,  5,182,180, 30,212,168,104, 69, 67, 40,184,186, 53, 70, 79,  9,169,170,197,213,
- 50, 93, 52,113, 72,255,  0, 49,226,145,114,131,  9, 39, 53,  9,172,194,150,150,132,  5,190,218, 95, 46, 57,109,169,216, 77,238,
-111,160,169,149,153,184,230, 81,116,233, 32,119,237,169,101,114, 85,232,169,119, 80,147,130,128,  5,  0, 10,  0, 20,  0, 40,  0,
-137,  9,  5, 74, 54, 72, 23, 36,247, 10,  0,200, 97, 61, 82,224, 60,147, 62,190, 51,199,243,145,242,121,118,154, 91,238, 53, 20,
-151, 80,148, 54,160,149, 93,196,141,151,  4,141, 55, 85,171,154, 75,182,225,158, 81,162, 41,219,214, 89,185, 60,144,146,111,168,
-216, 85, 82,224, 40,  0, 80,  0,160, 15, 36,242, 63,150,206,107,207, 61, 91,203,230, 57,182, 96,191,198, 30, 87,157, 22,108,114,
-  3,202,101, 74, 87,151, 17,182,215,188, 52, 26, 26, 18,119, 14,132, 92,169, 91,122,123,123,173,187, 58,117, 27,113,237,120, 99,
-215, 83,147,185,179,220,191,169,148,174,203,179,213,234,234,160,231,169, 95, 41,156, 79, 19,195, 50,153,206, 43, 42, 91, 25,108,
- 76, 87,102,134,164, 58,151,153,121, 17,208, 92, 90,  8, 41,  4, 40,165, 39,105, 10,181,250,138, 77, 38,241,118, 87, 20,103, 70,
-155,160,186,205,146,212,109, 57, 91,170,113, 85,241,208,115,228,227,159,101,242,112,242,220, 39, 41, 33,114, 98,226,210,204,140,
- 81,112,149, 41,166, 92, 42, 66,218,  4,244, 66, 72, 73, 72,236,185,236,164,222,244,241,140,163,113,127, 87, 17,118, 13, 76,167,
- 25, 91,147,174, 94, 30,227,213,213,205, 29, 81, 27, 35,145,131,136,129, 39, 41,147,144,136,184,232,109, 45,249, 82, 93, 59, 80,
-219, 77,130,165, 41, 68,246,  0, 41,209,139,147, 73, 98,216,217,201, 69, 57, 55, 68,143,158, 94,178,122,203, 59,213,142,109, 16,
-197, 82,227,241, 28,100,148,163, 15,  9, 90, 21,120,192, 50, 29, 31,174,176, 52, 31,160,157, 59,201,239, 52, 90, 21,166,180,235,
-243, 53,143,184,243,189,126,189,234,174,170,124,137,224,189,167,208, 69,100, 34,226,240,175,101,114, 14,134,161, 66, 97,201, 50,
-158, 87, 68, 52,202, 10,214,163,238,  0,154,224,227, 23, 38,146,226,207, 68,148,148, 83,111,130, 60, 45,134,129,200,126,105,125,
- 83,159,144,203,202,122, 31, 27,133,119, 18,210, 14,239,132,134,165,109,102, 59, 64,221, 33,197,218,234, 93,172, 72, 82,187,133,
-118,151,103, 13,186,194, 81, 85,147,244,190,108,224,236,219,158,231,168,110, 78,145, 94,133,201, 46,179,163,250,145,242,141,199,
-224,113, 57,185,126, 23, 34, 90,115,120,214, 21, 32, 68,144,226, 94,110, 74, 90, 78,229,163,238,130,149,144, 60, 36, 27, 95, 66,
- 53,184,207,210,239, 55, 29,196,174, 82,143,208,105,235, 54, 59,106,219,149,170,230, 75,206, 90,124,161,122,151,146,207, 98,114,
- 28, 31, 53, 37, 82, 94,194,165,183,177,110,186, 74,156,248, 55,  9, 73,108,147,169, 13, 40, 13,183,236, 85,186,  1, 81,239, 90,
- 88,194, 74,228, 87,205,199,199,241, 36,216,181,114,185,  7,110, 78,185,120,120,190,  7,168, 43,157, 58,112, 80,  0,160,  1, 64,
-  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  8,117,
-214,152,105,111, 60,176,219, 77,130,165,173, 70,201, 74, 70,164,146,104,  3, 57,153,206, 77,106, 35,111,176,223,194, 67,144,234,
- 24,109,231, 85,178, 83,165,119, 32, 50,209,  7,196,160, 44,157,222, 45,111,183, 74,  0,226, 92,151,214,142, 65, 41,227,132,244,
-227, 26,113,209, 46, 65,153, 41, 62,100,215,156, 39,196,160,208,243,  8, 61,183, 95,140,251, 43, 78,214,150,138,178, 69,105, 92,
-232, 51,152,245,115, 46, 59,150, 79, 50,230,147, 50, 72,200,189,251, 44, 58,100,173,230,138,215,165,194,130,143,133,157, 69,255,
-  0, 92,144,157, 58,212,212,132,187, 41, 33,157,165,139, 31,159,206,249, 59,202, 42,155,158,146,222,227,247,126, 32,178,155,251,
- 18,146,145,245, 10,153, 90,130,228,134,102,147,230,108, 61, 37,231, 57,220,231, 42,143,138,113,241,148,199, 50,195,173,170, 83,
-190, 39, 90, 36,  5,155, 59,247,148,  6,196,139, 42,227,197, 84,245, 54,161,151, 50,192,154,220,157,104,119,250,204, 44,130,128,
-  5,  0, 10,  0, 22,191, 90,  0,192,243, 95, 80,177, 92,112, 57,  6,  2, 17, 51, 53,107, 20, 13, 91,100,247,172,142,223,232,138,
-230,247, 77,238,222,150,176,135,106,126,133,227,247, 29, 46,215,177,220,213, 82,115,236,219,244,191, 23,188,225,153, 12,140,236,
-188,181,204,158,242,159,146,225,213, 74,251,  0, 29,  0,246, 10,243, 91,247,238, 95,158,105,188,205,158,153, 98,197,187, 16,203,
-  5,149, 35,111,144,200,241,175, 70,184, 73,230,124,149,147, 47, 36,249, 75,112,225,166,193,199, 95,112, 21, 37,180, 19,125,160,
-  1,117,171,179,234, 21,235, 63,183,118, 21, 20,149, 59,109, 85,191,246,245, 30, 69,251,147,247,  5,106,235,216, 78,137,127,185,
-244,156, 37,239,156, 47, 80, 76,255,  0, 62, 54, 47, 22,214, 60, 42,226, 17,105,197,248,123,139,155,193,191,180, 87,164,173,142,
-205, 41, 87, 83,203,222,255,  0,127, 53, 82, 84, 59,127, 16,229,124,107,215,222, 41, 43, 33,143,136, 49,156,195, 22, 18, 38, 68,
-184, 85,148, 65, 41, 33, 64, 13,205,174,198,215,212, 31,183,128,253,197,251,121, 73,127,119,244,203,216,207, 70,253,181,251,141,
-167, 95,233,225, 40,244,117,163, 61,198,115,114,120,214,113,137,200, 37, 41,109,126, 92,166,186,110,108,155, 40, 31,119, 81,237,
-175, 40,219,245,114,210,106, 20,185, 86,146, 93, 92,207, 91,220,116,145,213,233,220, 57,210,177,125,124,136,191, 58, 79,162, 79,
- 20,226, 47,182, 66,144,185,143,168, 17,208,130,202,107,232,109,129,167, 57, 53,208,143,156,127,113,166,161,  4,250, 89,139,224,
-255,  0, 50,156,131,139,240,204, 55, 19,225,188, 85, 89,119,177, 81, 66, 39, 74,120, 58,226,119,149, 41, 71,106, 24, 23,  0, 95,
-170,149,175,117, 92,191,181,194,119, 37, 59,147,203,153,225,224,202, 58,125,222,118,237, 70,221,184,102,202,177,240, 71, 71,244,
-231,230,235, 21,200,179, 17,240, 28,215, 20, 48,114,228,184, 25,106,115, 78, 21,198, 14,168,216, 37,196,172,  5, 34,231, 77,215,
- 35,190,213, 71, 85,179, 74, 17,205,109,230, 94,147, 71, 73,190, 70,228,148, 46, 44,173,243,228,114, 47, 80,202, 79,205,100,117,
- 38,218,230,241,100,123,238,205,141,105,233,255,  0,253,123,255,  0,166, 94,211, 35, 83,255,  0,236,151,253, 81,246, 29,155,213,
- 15,154, 54,248,166,116,240,206, 13,137, 25,238, 66,194,196,121, 47, 56, 86, 88, 76,131,161,101,180, 53,226,113, 96,232,108, 69,
-142,154,214, 78,147,105,239, 33,222, 92,121, 98,109,107,119,158,238,125,221,168,230,151,183,160,202,204,249,144,245,191,135,165,
-140,167, 55,224,236,179,131,121, 97, 37,207, 45,232,231, 93,118,135, 55,184, 18,162, 58,  5,166,172,199,109,210,221,194,221,204,
- 74,147,221,117,118,105, 43,182,251, 39, 85,159,243, 33,195, 97,250,115,  7,212,118, 35, 73,153,  2, 92,180,227,158,130,214,193,
- 34, 60,162,218,220, 82, 92,220, 64,211,103, 81,214,224,214,108,118,203,142,243,180,218, 77, 42,248,209,171, 61,214,210,176,175,
- 36,218,110,148,232,102,  7, 49,243,126, 50, 49, 89, 99,211,190, 39, 47, 41,152, 90, 74,228,162, 82, 84,164, 50,  1,176, 27, 35,
-238, 82,238, 53,189,210,  5, 94,134,205,149,214,236,212, 87,135, 73,159, 61,247, 50,165,152, 57, 63, 14,130, 55,167,159, 55, 51,
-242,156,158, 55, 26,231,152, 70,113,194, 99,201,138,137,145,124,196, 22, 94, 89,218,144,235, 78,149, 27, 18, 64, 36, 29, 59,169,
-218,157,153, 70,219,157,185, 86,131,116,155,227,149,197, 11,177,165,112,255,  0, 83,117,235, 23,204,167, 31,244,198,119,251, 63,
-142,134,115,124,152, 33, 46, 62,192, 95,149, 30, 48, 88,186, 67,171,177, 37, 68,107,177, 35,167, 82, 42,150,139,107,158,161,102,
-111, 44,125,101,237,126,237, 13, 51,200,150,105,122,142,101, 11,230,247,150, 32, 38, 79, 41,225,126, 87, 29,146, 10, 62, 46, 39,
-158,218,128, 88,181,210,167,129, 66,189,215, 23,173, 25,108,214,248, 66,125,163, 50, 59,237,197,140,237,246, 95, 53, 83,  3,242,
-169, 54, 36, 31, 82,114, 57,  9, 78,165,136, 49,241,146,159,125,229,248, 82,134,155, 90, 20,165, 43,184,  0, 47, 87, 55,152,183,
-101, 37,199, 50, 40,236,114, 74,252,155,225,149,157, 51, 49,243, 99,201,249, 15, 32, 94,  3,210,110, 44, 50, 96, 21,  6,100, 74,
- 75,142,188,234, 80,117,112, 52,217, 72, 66,127,174,175,125,170,132, 54,139,118,225,154,244,232,105, 79,122,185,114,121, 44, 67,
- 48, 34,124,211,115,190, 33,156,143,138,245,107,136,140,124, 89, 22, 81,126, 50, 28,105,228,182, 77,138,210,149,169,104,112, 14,
-208,149, 10, 71,180,218,187,  7, 43, 51,168, 45,230,245,153,168,223,133, 60, 61, 39, 74,245, 15,230, 71,136,122,125, 35, 18,211,
-208,229,101, 99,230, 97, 39, 37, 14, 84, 34,223,150, 89,113, 69, 41,251,234,  6,230,215,172,253, 54,217,114,250,116,105,101,116,
-196,211,213,238,214,180,238, 53, 78, 89,149, 85, 12,183, 10,249,149,204,122,137,234,110, 51,143, 96, 48,  6, 63,  9,124,190,137,
- 57,  7,208,181,200,220,220, 87, 29, 73, 42, 65,242,219,186,210,145,109,106,206,163,108,141,139, 14, 82,151,111,163,202, 85,211,
-110,210,212,106, 20, 35, 30,198, 56,249, 31,144,244,120,212,  3, 88,  7, 70,114, 95,153, 14,113, 27,133,250, 89,151, 71,152,  6,
- 83, 60,210,241, 24,246,174, 66,137,148,146,151, 86, 45,168,216,209, 90,175,223, 97,219, 90,155,102,157,221,190,186, 35,139,242,
- 25, 27,182,165, 89,211,203,166, 88, 47, 47,192,229,223, 38,220, 46, 76, 28, 62, 87,153,203,108,160,101,150,136,208,111,212,177,
- 20,171,122,199,177, 78, 40,167,251, 21,161,190, 95, 82,154,182,191,167,143,148,206,216, 52,238, 54,229,113,255,  0, 87, 15, 18,
-248,250,143, 86, 87, 54,117,  7,141,253,104,245, 19, 53,235,111, 48,103,209,255,  0, 77,215,231, 96, 25,122,249, 76,131,100,150,
-100, 56,202,134,231, 20,164,233,240,236,158,159,174,187, 90,254, 10,235, 52, 90,120,233, 45,247,247,120,242, 94, 28,217,198,235,
-245, 51,214,221,252,189,159,151,155,240,228,189, 47,200,115, 79, 92, 56, 22, 43,211,126,109,197, 56,206, 37, 63,179,111, 17, 13,
-233, 47,168,  0,227,242, 23, 54, 72, 91,171,183,105,218, 61,192,  1,208, 85,253,191, 81, 43,246,167, 57,127,185,249, 48, 70,118,
-231,166,134,158,244, 33, 31,246,175, 43,204,241, 61,115,235,230, 73,220, 87,161,124,166, 75, 68,165, 78, 69,106, 33, 41,235,182,
-100,134,163,168,117, 26, 16,225,189,114,219,100,115,106, 96,186,253, 74,167, 95,186,207, 46,150,111,170,158,118,145,204,254, 74,
-241,173,167,139,103,242,182, 30,107,249, 33, 25, 71,183,108,120,237,172,127,239,198,180,119,217,127,150, 43,251,125,111,224,102,
-126,222,133, 44,202, 93, 50,245, 37,239, 61, 74,161,116,145,236,174,112,233,207,  6,252,178, 47,242,111, 92,178, 24,182, 84,124,
-149, 71,159, 14,201, 22,  5, 44,190,133,141, 13,237,253,221,118,155,191,107, 74,165,214,159,160,225, 54, 94,198,174, 81,234,146,
-244,158,243,174, 44,238,193, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  7, 37,245, 93,184,110,242, 28, 58, 38,171, 30,134,
-140,  9,219, 87,150, 83,137,142, 23,185,171, 20,150,188, 91,255,  0, 86,180,180,181,202,233, 94, 43,129, 12,248,148, 81,249, 38,
- 87, 12,220, 89,240,119, 54,244,140, 86, 14, 44,153, 82,182,110,105,165,124, 78,231, 74,157, 33,  2,229, 32,  5, 47, 79, 16, 38,
-165,118,227, 42,167,211, 47, 96,218,211,208, 91,177,206, 57,115,241,254, 60,204,142,148, 68,143,141,117,214, 27,101, 14,182,249,
-153,144, 92, 69, 40, 44, 43,194, 10,  0, 87,134,250,244,168,221,136, 39, 74,116,250, 21, 71,102,101, 60,238,103,155,252,209, 25,
-196, 75, 97,220,188,104,179,154,114,  0,104, 36,227,210,114, 12, 48, 67,151, 87,136,165,177,190,238, 88,118,146, 83, 82, 70,204,
-114,229,166, 21, 94, 92, 24,215, 39, 90,151,184,206, 79,202, 51,203, 16,157,200, 71,248, 36,192,201, 73,146,182,144,203,223, 18,
-220,103, 80,210, 44,182,148, 82,149,126,210,202, 40, 59,116,208,107, 81, 74,212, 33,141, 57,161,201,182, 92,192,142, 56,238, 43,
- 16,166,154,198,224,191, 51, 91, 77, 76,202, 66, 97,182,236,210, 99, 45,212,121,138,113, 33, 59,148,180,237,220,171,141,123,200,
-168,164,243,201,241,149, 57,121, 71,112, 14, 15, 49,200, 58,136,173,202,148,210, 38, 74,127, 20,134,153,218,148, 41,214,101,170,
-206, 45,  8, 87,139,106,192, 42, 29,118,247,233, 68,172,172,105,214, 10, 67, 76,114, 92,235,113, 32,187, 43, 32,144,222, 70, 60,
- 87,159,150,182, 91, 74, 98,  7,164,121, 75, 80,176,  2,219, 72, 23,114,224, 43, 94,158, 26, 87,110, 53,116, 92, 43,229,192, 42,
-202,137,188,178,102, 18,  6, 69,204,102, 81,185, 14,180,246, 74,103,156,175,134, 67,111,249, 42,109, 41,186,149,125,198,231,110,
-198, 80, 10,143,233, 39, 75,201, 27, 74, 77, 85,116,116,248,121,198,185, 80,180,147,145,153,139, 15,191, 29,227,147,157, 31, 49,
-144, 83, 81,159, 75, 75, 90, 20,214, 46, 99,168, 74,118, 33, 42, 73, 89, 72, 79,186,224,117, 53, 26,138,151, 82,162,255,  0,226,
- 66,214,132,184,217,204,180,236,156,108, 84, 28,210, 37, 67,121,228,167,243,102, 26,101, 68,239,132,227,234,108, 11, 20, 93, 42,
- 74, 20, 60, 55,218,160, 13,250,211, 92, 34,149, 90,242,121, 69,171, 53,124,114,123,249, 94, 61,137,202, 73,183,196,205,133, 26,
- 75,219, 69,147,189,230,146,181, 88,119, 92,213,123,145,203, 38,151, 38, 61, 58,162,183, 59,155,196,195,200, 38, 62, 94, 82, 26,
-141, 25,180,200, 76, 82, 73, 91,239, 18,178,143,  8,  4,148,160, 54, 85,221,123,119, 83, 18,168,165, 87, 28,143, 59,147,228, 19,
-203,178,133, 72,102,199,242,120, 68,248, 99, 71, 87,233,144, 46, 60,231, 71,222, 63,162,159, 15,235, 93,238,137,  8,107,161, 98,
-113,120,229, 56,184, 16,152,138,183,148,167, 30, 91, 45,161,181, 45,107, 55, 81, 81, 72,  4,146,105,174, 77,241, 96,146, 69, 47,
- 42,129,143,228,173, 30, 57, 53,164, 59, 17, 96,174, 99,171,  9,253,147, 96, 88,169, 42, 80, 33, 42,177,208,255,  0, 53,232,140,
-156, 93, 80, 53, 94, 39,159, 23,195,125, 62,199,202,116, 54,185,121, 22,208,226,188,149,108,109,161,180, 31, 15,141,194,233, 62,
-253,130,182, 86,102,184, 36, 84,105, 26,174, 23,152,227,156, 95, 52,153,144,241,162, 10, 94, 72,140,251,229,213, 56,181, 54,181,
-143, 10,133,146,159,189, 98,155, 38,247,211,182,160,191,110, 82,143, 30,  3,224,210,103,127,172,178,200, 40,  0, 80,  2, 29,117,
-166, 26, 91,207,173, 45,178,216, 42, 91,139, 33, 41, 74, 71, 82, 73,166,202, 74, 42,175,  4,135, 70, 46, 78,137, 85,179,142,243,
-127, 85, 92,145,230, 98,248,194,203,108,106,151,178,  3, 69,168,118,134,251,135,244,186,215,  5,186,254,224,114,173,187, 15, 14,
-114,247,123,206,255,  0,106,253,188,163, 75,154,133,143, 40,251,253,198, 11, 11,198,242,121,255,  0, 62, 67, 41, 80,140,202, 86,
-227,210, 20,  9,  4,164, 21, 16, 59,201,174,123, 69,182,221,213, 86, 75,  8,170,182,252, 56,179,162,214,238, 86,180,180,139,198,
- 78,137, 47, 14,  8,169, 97, 97,183,155,113, 66,233, 74,146,162, 61,128,222,179,109,203, 44,147,124,153,167,114, 57,162,210,230,
-139,255,  0,154,142, 43,148,229,190,156, 97, 51,248,  6,213, 50, 62, 21,229,201,150,195, 32,169, 95, 15, 33,176, 60,208,  7, 93,
-133, 34,254,195,122,250, 59, 98,213, 91, 83,227,132,210,163, 62,105,253,193,164,184,225,130,198, 13,213, 30, 33,174,224,243,243,
-214,255,  0, 39,156, 87, 45,141,252,239,153,228, 27, 84, 92, 52,166, 81, 30, 42,156,  5, 33,212,182,162,226,220, 23,253, 20,216,
-  0,123,117,238,174, 71,126,212,195,  8,215,229,197,245, 29,175,237,237, 44,241,157, 62,106, 37,214, 78,201, 62,220,156,140,185,
- 45, 11, 52,243,206, 56,129,253, 21, 40,145, 95, 53, 95,154,157,201, 73,112,109,159, 78,233,224,225,110, 49,124, 82, 94,162,167,
-230,148,187,255,  0,237,183,  3, 14,223,120,121,206,189,127,248, 58,109, 95, 67,126,210,175,116,171,199, 36, 79,156,127,120,211,
-189,116,225,158, 71, 83,249, 91,107,140, 63,233,102, 59,242,175, 37, 83,144, 92, 25,100,166,222,104,148, 92, 85,252,206,221, 83,
-109,183,253, 27, 81,187, 41,254, 97,230,225,203,196, 59,102,112,252,180,114,241,231,227, 60,215,243, 77,254,207, 31, 87, 36, 39,
-141, 22,149, 32, 70, 96,101, 12, 98,  8,248,251,170,247, 41,211,126,221,155,189,189,117,174,147,104,206,180,253,174, 21,195,196,
-114,219,211,131,212,246, 56,209, 87,198, 35, 59,241,159,196, 39, 31, 19,  9,252,192, 75,193,  9,  5, 93,124,224,212,112,171,223,
-182,253,105,182,233,249, 41, 83,133, 39,237, 31,118,191,159,141,120,214, 30,195, 29,198,224,114,121, 62,168,152, 24,172,138, 49,
- 60,177, 83,229, 54,212,201, 36, 36, 38, 86,229,133,  2, 84,149,120,148,110,  6,157,106,229,233, 91, 90,122,201,102,141, 22, 29,
- 69, 11, 16,184,245, 52,139,203, 58,188, 95, 73,219, 57,135,167, 62,188,191,129,114, 15, 55,231, 88,244,113,249,107,109,133,166,
-123,232,105,149,184,165,  2,218,119, 22,134,183, 26,107, 88,214, 53, 90, 69, 58,219,182,243, 46,143,245, 55,181, 26, 61, 99,133,
- 46,221, 89, 95, 75,248, 24,222,115,233,119, 42,244,199,210, 73,113,115,242, 99, 63, 11, 37,155,131, 34, 24,138,181, 56,144,180,
-198,146,149,168,220,  1,168,219,210,173,233,245,144,212,106, 83,138,105,168,190, 62, 52, 81,213,104,174,105,180,173, 73,166,156,
-149, 41,226,103,160,126, 83, 48,184,214,189, 48,143, 57,182, 18, 37, 76,144,250,228,187, 97,185,106, 66,202, 19,115,219, 96, 44,
- 43, 11,120,155,122,134,159, 36,142,139,100,130, 90,100,215, 22,217,194,190, 99,226, 69,133,243,  1, 28,199,109, 45,  7,191, 44,
-121,237,162,219,150, 84, 18, 84,109,219,100,138,220,219, 27,122, 71,255,  0,113,207,238,201, 45,106,255,  0,180,205,185,240,  8,
-249,136,124,243,109,162, 15,231,206, 25,166, 77,188,173,165,195,229,149,238,211,103,221,246,109,246, 84,216,189, 23,248,248,229,
- 43,246, 86,189,247,188, 51,227, 83,221,188,169,158, 32,223,  9,201,187,200, 76,111,246,108,194,112,202, 91,165, 62, 81,100,182,
-109,110,194, 79,232, 91, 91,218,213,197, 89, 83,239, 22, 95,154,167,123,125,219,238,158,122,101,161,243,219,211, 86,229, 59, 11,
-156,163, 28, 20, 95, 60,122, 74,146, 19,247,188,164,190,202,156,233,255,  0,107, 10,189,119,186,182,147,183, 95,247,175, 83, 60,
-235, 68,155,141,218,127,177,250,209, 97,232,150, 31,158,230,179, 83,226,250,121,156,103, 13,152, 12, 37, 79,  7, 84, 18,183,153,
- 11,212, 34,232, 93,246,155, 19,106,143,112,185,102, 17, 78,236,115, 42,146,237,150,239,206, 77, 89,146,139,161,209,121,159,164,
- 30,177,114,169,216,220, 23, 54,230, 88,201,185, 75, 56,246, 42,  4,185, 41, 67,234, 73,218,151, 11,105, 13,164,155,216,125, 94,
-202,207,177,174,211, 91, 78, 86,237,201, 46,110,134,150,163,111,213, 93,106, 55, 46, 69,190, 73,191,129,135,245,195,139,230,120,
-100,126, 17,198, 51,238, 54,238, 75, 31,137,113,181, 45,146, 84,143, 45, 82,221, 82,  0, 36,  3,160, 54,171,187,117,216,221,119,
- 39, 30, 14, 94,196,103,238,118,101,101, 91,132,184,168,251, 89,238, 31, 74, 56,238, 43,  7,192,240, 17,113,241,208,211, 66, 20,
-117,157,160,  2,167, 28,109, 42, 90,207,122,148,162, 73, 53,197,234,174, 57,221,147,125, 44,238,244,150,227,110,204, 84,120, 81,
- 27, 73, 18, 35,195,142,236,185, 78,165,136,172, 33, 78,188,243,132, 37,  8,109,  3,114,148,165, 29,  0,  0, 92,154,174,147,110,
-136,180,218, 74,172,240, 87, 42,204,229,254,102,189,100,143,139,198, 41,198,248,164, 37, 41,152, 70,198,204, 99,155, 80,243,164,
- 40, 30,142, 60, 64,181,251,208,147,210,245,219, 91,140,118,253, 51,147,249,159,175,146,242,123,206, 10,236,229,185,106,148, 87,
-200,189, 11,155,242,251,143,114,113,188, 12, 14, 55,134,135,134,198, 50,152,240,161,180,134, 24,101, 61, 18,134,210, 18,  7,183,
- 65,214,184,185,205,206, 78, 79,139, 59,187,112,140, 34,163, 28, 18, 60,237,243, 87,235, 92,174, 55, 25, 94,155,113,165,173,156,
-190, 69,128,230, 98,122, 65, 73,102, 35,215,  1,166,207,235,184,  1,220,174,196,232, 53, 62, 30,135,104,208,171,143,189,151,  5,
-193,117,156,214,245,184, 59,107,185,135, 22,177,125, 70, 43,208,239, 84, 61, 18,244,175,  7,105,146, 38, 73,228,179, 66, 87,147,
-152,136,106, 80,220, 58, 52,217, 36, 31, 45, 31,105,185,238,  2,206,191, 71,170,212,206,180, 89, 87,  5, 82,166,221,173,210,105,
-109,210,173,201,241,116,244,120,140, 23,204, 23,169, 92, 99,212,111, 81, 49, 28,151,141, 45,229,226,225,227,163, 68,120,190,209,
-105,126,107, 50,159,117, 86, 73, 38,227,107,137,173, 13,187, 75, 59, 22,101,  9,113,109,250,145,155,186,107, 45,234, 47,198,112,
-224,146, 94,150,119,223, 82, 61, 71,227, 30,171,122,  1,205, 21,197, 28,125,196,227, 68, 33, 39,207,100,182,110,220,182, 30, 54,
- 23, 55, 27, 82,110,123, 43,  7, 73,165,158,155, 85,  5, 62,117,245, 51,162,214,106,237,234,180,119, 29,186,225, 79, 90,100, 95,
-146,201, 72, 87, 11,206, 66, 31,222, 53,149, 91,170,215, 93,174,198, 97, 35, 79,251,153,167,111,171,252,209,127,219,237, 99, 63,
-111, 75,252, 18, 95,221,236, 71,167, 79, 67, 92,241,211, 30, 11,249,107, 31,154,250,237, 63, 33, 28,254,197, 45,100,101,233,101,
- 13,142,188,148, 13, 65,255,  0,182, 13,107,180,221,187, 58, 84,159, 74, 71,  7,179,118,181,141,174,137, 63, 73,239, 81,210,184,
-179,188,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64, 13,187, 29,135,172, 94,105, 14, 17,211,122, 66,173,127,125, 42,109,
-  0,153, 10,140,195, 47, 73,144,  0,105, 13,169, 79, 43,110,227,229,160, 18,110,  0, 36,139, 95, 74, 21, 94,  0, 84, 63,201,248,
-187, 73,121,111,205, 96, 37,175, 37, 47, 18,146,109,230,180,100, 53,127, 15,107,105, 43, 30,202,149, 90,159, 71,135,  1,185,144,
-226,249, 31, 30, 76,148,176,169, 77,153, 43,148,172,117,130, 20,162, 37,  0,141,205,168,132,157,191,121,  2,231, 75,148,142,182,
-164,238,229, 78, 28,170, 21, 66,163,103, 48,147, 90,243, 49,206,183, 36,166, 59,174,182, 16,146,  1,101,149,150,148, 47,182,192,
-111, 65, 77,189,148, 56, 73,113, 22,168,175,143,204, 49,179,176,209,167, 71,108, 56,227,234,198,161,232, 74,220,130,218,114,114,
- 27, 97, 42,  5,104, 27,146,146,181, 89, 65, 54, 86,210, 46, 59, 30,236,181, 42,120,253,  2,102,192,150,190, 81,198,236,183, 87,
- 45,  7,202, 82, 16, 23,229,172,149, 23, 28,242,208, 91,240,248,193, 88,218, 10, 46, 55,123,105,157,212,250,  2,168,103, 35,203,
- 48, 48, 49, 78,100, 91, 90, 95,  2, 59,238,181, 29, 13,175,114,147, 24,148,173, 43,  1,  4,182,144,177,177, 69,105,  0, 43, 67,
-173, 58, 54,164,229, 64,114, 84, 22,174, 79,198, 90,105,102, 84,134,153, 75, 45,149,188, 20,130, 91, 69,146,159, 49, 33,123,118,
-146,144,161,188, 13, 64,235,106, 78,238,124,130,168,149, 39, 51,133,135, 29,140,140,135,  2, 27,151,227, 97,126, 82,203,139,218,
-130,162,173,129, 37,118, 74, 46, 73,182,137,235,165, 53, 66, 77,208, 90,162, 57,229, 92,105, 14, 41,134,229,161,199, 89, 90, 83,
-229,176,219,143, 43,204,117,  5,208, 18, 27, 66,174, 84,139,175,195,250, 55, 61, 47, 78,238,167,208, 38,100, 90, 64,151, 18,124,
- 38, 38, 64, 80, 92, 39,144, 20,194,194, 74, 18,164,118, 16,  8, 26, 30,207,101, 71, 36,211,163,226, 42, 50, 89,  9,204,198,109,
-179, 34, 43,114, 50, 51, 19,241, 50, 84,189,118,  7, 71,133,171,218,228, 37, 62, 29,  8,239,237,169,109,194,184,136,216,174, 31,
-156, 97,188, 66,113,204, 70,122, 65,130,235,145,137,140,217, 91,105, 82, 21,125,165, 87,176, 54, 32,251,  1, 21, 28,213, 29,  5,
- 69,210,242,153,135, 16,165, 51,137,113,180, 38,229, 74,113,109,239,218, 63, 81,  0,220,171,184, 27, 83,  5, 57,191, 48,229, 72,
-141,  1,220,  4, 21,159,204,165, 29,249,103,181,191,146,189, 91, 74, 73,  0,148,173, 38,255,  0, 88, 62, 34,160, 47,105,173, 87,
-180,200,110, 75,145,206,171, 68,174, 43, 13,139,127,148,103, 34,226,161,120,153, 75,128,184,224,213, 30, 96,214,250,118, 54, 60,
-106,254,149,135, 81, 81,206,106, 42,175,144,228,170,122,134, 59, 41,141, 29,168,232, 42, 82, 89, 66, 91, 74,150,119, 40,132, 11,
- 92,158,211,165, 98,183, 86, 92, 28,164,  0, 80,  6, 75,212,124, 78, 87, 51,198, 93,137,137, 36,188, 28, 67,142,178, 13,139,173,
- 32, 27,160,125, 54, 63, 69, 98,111, 58,107,183,244,206, 54,248,214,180,233, 93,  6,230,203,169,181,167,212,169,221,225, 74, 87,
-161,244,156,187,139,122,103,148,201,201, 14,102, 26, 84, 72,136, 58,180,116,113,126,207, 96,174, 83,109,253,189,114,228,179, 95,
- 89, 98,185,115,126,228,117,187,151,238, 43,118,227,150,195,205, 39,207,146,247,179,182,227,176,208,113,176,211, 10, 59, 41, 67,
- 33, 59, 54,  1, 97,106,244, 40, 90,132, 34,161, 21, 68,185, 30,119, 59,179,156,156,228,235, 39,204,243,183, 53,227,111,113,156,
-227,241,  8, 38, 35,164,187, 17,194, 52, 83,106, 61, 61,233,232,107,201,119, 93, 11,210,223,113,254,151,140,124, 95,  3,215, 54,
-157,122,213,216, 82,254,165,132,188,127, 18,223,134,250,139, 43,142, 51,249,110, 65,163, 55, 18,111,181, 23,253,163, 96,245,  9,
-190,132,123, 13,104,109,123,236,244,171, 36,214,104,114,233, 70,126,235,176,195, 85, 46,242, 15, 44,249,244, 50,116,132,122, 13,
- 50, 89,204, 72,227, 81, 14, 72,157,234, 39, 30,217, 89, 95, 91,157, 54,147,237,174,209,126,238,180,161, 78,242,126, 44, 78, 33,
-254,206,186,231, 87,110, 30, 60,  8,124,167,212, 51,147,132,112,184, 24,223,151, 98,  8,  8,115,160,113,196, 14,137,178,116, 74,
-125,130,184,237,211,127,158,166, 46, 22,214, 88,190, 61, 44,236,246,175,219,240,210,201, 78,227,205, 37,195,161, 25,206, 49,132,
-123, 63,152, 98, 19,105, 37,173,193,114, 22, 58, 37,176,117,250,250, 10,201,219, 52, 79, 85,125, 67,151, 25,120,141,125,211, 91,
- 29, 45,135, 62,124, 35,227, 58, 79,172, 30,138,183,234,182, 15, 13,138, 25, 67,137, 24,167, 86,242, 84,134,  3,225,126, 98,  2,
- 54,216,173, 22,181,171,220,180, 26,223,202,182,212,107, 85,226, 60, 31,113,208,254,109, 36,229, 74, 58,244,156,142,103,201,222,
- 75, 30,211, 43,226,220,185,232,146, 84,216,110,111,152,218,155, 75,138,237, 82,124,167, 46,  1,253, 83,127,125,106,199,123, 79,
-231,130,125,  6, 60,182,  7, 31,248,238, 53,210, 95,122,115,242,151,136,227,121,120,249,238, 81,144, 86,106,108,101,135,153,141,
-229,249,113,131,160,220, 41, 64,149, 41,100, 29, 69,236, 61,134,160,213,111, 19,185, 28,176, 89, 83,243,150,116,155, 28, 45, 73,
- 78,111, 51, 94, 98,239,144,252,182,163, 51,234,147, 62,164,163, 60,182,139, 83, 34,205,252,187,225, 66,135,250,166,207,  7,153,
-230,143,189,179,174,221, 42, 27,123,155,133,142,231, 47, 38,171, 94,146,107,155, 74,158,163,190,205,205, 58, 83,163,202, 15, 85,
-126, 88,112, 28,251, 38,174, 73,135,154,188, 23, 34,118,202,148,227,104, 14, 48,250,211,209,106, 69,210, 82,189, 53, 82, 85,244,
- 94,151, 71,186,206,196,114, 53,154, 34,107,118,123,119,229,158, 47, 44,140, 34,126, 82,185,102, 97,248,237,114,238,110,252,236,
-108, 98, 60,182,128,117,229,  4,247, 35,206,112,165, 26,118,216,213,223,214, 97, 21,216,182,147, 40,254,133, 57,181,222, 92,109,
- 47, 14,103, 86,230,126,129,227, 57, 47,166,216,191, 78,113,153, 39,113,112, 49, 82, 91,148,203,235, 73,152,226,139,104,113, 36,
- 43,122,209,247,139,132,222,254,225, 89,150, 55,  9, 91,188,238,181,153,181,226, 53,117, 59,108, 46,216, 86, 98,242,168,191, 25,
-168,244,155,211,211,233,159, 18,143,197,254, 52,228,  4,117,184,191,137, 45,134, 74,188,213, 21, 91,104, 82,237,107,247,213,109,
- 94,163,191,184,231, 74, 84,181,163,211,126, 94,210,183, 90,208,192,122,159,242,228, 61, 67,231,172,243,113,159, 84, 21, 54,152,
-200,248, 33, 20, 58, 63,213, 85,123,239,243, 83,247,191,171,165, 95,210,238,110,197,174,239, 45,120,243,233,242, 25,250,189,165,
- 95,188,174,102,167, 12, 41,209,229, 36,250,179,242,221,199,189, 75,117,188,203, 18,149,136,228,200,109, 45, 59, 49,164,  7, 27,
-125, 45,139, 39,205,108,148,220,129,160, 80, 85,237,223,165, 51, 69,185,207, 78,178,211, 52,122,  7,235,182,171,122,151,154,185,
-101,211,211,227, 57,158, 51,228,255,  0, 58,235,173, 68,228, 92,181,215,240,108,155,136,113,208,189, 71,112,243, 22, 82,143,126,
-211, 90, 51,222,215, 24, 67, 19, 50, 27, 12,184, 78,229, 99,208,110,253, 42,249,104,103,211, 94, 73, 35, 54,188,209,203, 71,145,
- 21,200,110, 67,118, 42, 90, 73, 67,164, 19,115,230, 46,250, 11, 90,213, 71, 89,186, 61, 68, 20,114,229,163,175, 18,254,135,104,
- 90,105,185,102,205, 85, 74, 83,226,103,249, 87,202, 28, 83,153, 94,115,211,252,251,216,  7, 20,178,227,113, 74, 84,180,178,165,
-117, 13, 58,133,165,105, 29,192,223,223, 86, 45,111, 82,203,150,228,115, 21,175,108, 81,205,154,212,156,  6,120,239,202, 92,151,
-115,140,231, 57,231, 38,147,154,121,149,165,126, 90, 11,136, 90,202, 53,  1, 79, 45,106, 93,189,137,183,190,150,238,243,217,203,
-110, 10, 62, 29,  1,107, 99,237,230,187, 55, 47, 14,147,105,235, 31,203,186, 61, 85,203, 99, 50,163, 56,188,103,229,208,196, 20,
-176,152,194, 64, 80, 11, 82,194,183, 23, 81,111,189,107, 90,170,104,183, 39,166,139,142, 92,213,117,226, 92,215,237, 75, 85, 37,
- 44,217,104,169,194,190,211,176,241,236, 89,194, 97, 96,226, 75,158,111,193, 48,212,127, 48,141,187,188,164,  4, 94,218,218,246,
-172,169,203, 52,155,233, 54, 33, 28,177, 81,232, 71,154,126,110,125, 92,252,182,  8,244,191,  4,253,167,206, 66, 94,228, 14,182,
-108, 91,138,175, 19,113,238, 59, 93,251,203,254,133,135, 69,215, 71,179,104,243, 62,246, 92, 23, 15, 31, 79,144,229,247,205,118,
- 85,220,199,139,249,188, 93, 30, 95, 14, 36, 47,151, 92,247,164, 30,155,241,143,138,205,114,136, 13,242,140,182,215,242,  0,169,
- 69, 76,164, 15,217,177,112,146, 60,  0,146,171,126,145, 61, 64, 20,110, 86,245, 26,139,152, 65,229,143, 15,120,109, 87,116,218,
-107, 93,169,172,210,227,238, 59,206, 51,214,191, 74,179, 57,  8,216,172, 95, 41,133, 39, 35, 49,196,177, 22, 59,106, 86,231, 28,
- 89,178, 82, 46,158,164,214, 52,244, 55,224,156,156, 90, 72,220,134,225,167,156,148, 99, 52,219, 48, 60,195,148,122,  7,156,245,
- 51,253,143,229, 24, 86,231,243,101,191, 31, 28,167,223,130, 29, 73, 91,169, 73,109, 37,211,250, 32, 44,123,170,237,171, 58,168,
-216,239, 33, 42, 67,143, 18,141,235,250, 57,223,238,231, 26,206,169,112,246,155, 81,232, 87,164,196,  2, 56,158, 50,199,255,  0,
-147, 55,254, 74,165,249,237, 71,251,229,231, 47,126,159,166,255,  0,233,199,204,121, 35,230,111,136,113,206, 37,234,142, 19, 17,
-199,177,177,241,216,215,241,113, 31,122, 52,118,210,219,106,113,201,146, 80,165, 16, 52, 36,165,  9, 31, 69,117, 91, 85,233,220,
-177, 39, 38,219,171,245, 35,143,222, 44, 91,183,168,140, 96,146, 89, 87, 15, 27, 61,108,255,  0,165, 60, 95,253,130,228, 28, 99,
-142,227, 99, 98,147,158,132,243, 11,248,118,210,218,124,245,180, 82,219,138,  9,234, 82,108,107,148,134,174,231,123, 25,205,185,
-101,103, 99, 61, 29,190,234, 86,224,148,115, 46, 71,147,254, 90,253, 67,139,233,103, 55,203,113,158,102,191,202,160,228,136,141,
- 37,217, 55, 66, 98,207,136,165, 36,  7,111,162, 18,119, 45, 42, 87, 97,  9,190,154,142,171,117,211, 61, 69,184,206,222, 45,122,
- 83, 57, 13,159, 86,180,215,101,110,231,101, 63, 67, 71,164,189, 93,245,235,132,113, 46, 27,144, 86, 23, 57, 15, 43,201, 38,176,
-184,248,184,144, 31,110, 74,210,235,169, 41, 75,174,121,106, 80, 66, 17,125,222, 43,110,181,133,115,250, 45,190,237,219,139, 52,
- 90,138,227, 83,164,215,110, 86,173, 90,121,100,156,159, 10, 58,156,199,228,223,131, 73,137, 11, 41,205,230,180, 80,156,137, 76,
- 76,113, 80,177, 44, 48,162, 93, 88,239, 74,151,100,255,  0, 96,213,253,243, 80,165, 37,109,127, 78, 47,195,195,137,157,176,105,
-156, 97, 43,175,250,176, 94, 47, 15, 81,235, 58,230,142,168, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 34,  2,
-129, 74,133,210,116, 32,234,  8, 52,  1,129,197,250, 97, 26, 19,205,174, 76,195, 33,159,134,147, 22, 67, 69, 54,243, 18,180,173,
-136,228,146, 79,247, 81,221, 91, 94,219,213,201,106, 91,224,188, 57,250, 72,212,  6,227,122,100,182, 24,144, 78, 76,174,123,240,
-188,180,200, 40,251,185, 37, 62,153, 11,151,247,175,114,182,218,211,250, 61,117,165,122,154,242,194,190,142,128,200, 89, 97, 56,
- 67,156,125, 82,147,142,152,143,134,148, 25, 96,180,227,101, 94, 92, 86, 88,112, 41,180, 16,161, 98,167,156, 46,238,238,211,219,
- 76,157,236,244,170,240,255,  0, 65, 84,104, 28,126, 29, 59,225,226,183, 54,123, 78,187,  9, 24,198, 35,150,152, 45, 39,201,198,
-203,110, 73, 42, 10,113,100,169,207, 44, 39, 66,  0,235,106, 71,121, 87,  5,198,190,149, 64,202, 51,  3,129, 57,  7,224,155, 76,
-182, 84,198, 60,199, 76,117,249, 78,121,202,106, 59,237,187,101,169, 79, 44,116,108, 39,192,144,  9,241,123,  3,165,126,181,195,
-136, 40,142,191,195,178,  9, 98,114, 32, 79,101,183,114, 45,207,143, 32,188,194,156, 72,106,116,183,228,160,163,107,136,178,145,
-231,169, 38,247, 10,235,165,172, 90,175, 42,170,174, 20,244, 36,189,129,148,140,191, 79, 86, 82,227,  2, 83, 42,138,167, 94,144,
-146,227, 46, 45,208,185, 42, 43, 90,110, 94,216, 19,117, 43, 80,221,236,109,217,114,239,204,117,  9,148,189,200, 98, 50,242,165,
-162,124,121,172, 53, 46, 50,222, 76, 63, 49,133, 56,132,198,144,210, 18,164,173, 33,196,221, 97,104,222, 21,123, 91,195,110,218,
-138, 51,138, 84,160,230,153,150,159,195,114, 88,120, 24,248, 88, 53,173,105, 98,104,125, 82,219, 70,231,154,105,184,  9,136,144,
- 82,151,216, 90,183,109,215,107,131,218,  8,171, 17,188,164,219,151, 71,182,189, 99, 92,105,192,217,241,214, 95,141,132,131, 30,
- 76, 68,193,121,150,146,217,136,218,183, 37,176,141, 18, 47,185,122,216,  2,124,106,215,180,245,170,183, 26,114,116,117, 30,184,
- 28,199,150,156,222, 43,227, 24, 12,130,242,  2, 80,198, 67,120, 45,165,181, 16,144,234,210,108,161,177, 38,228, 11,141, 58,218,
-172, 65,246, 70, 62, 35,104,201, 72,226,144,217,192, 97, 36, 41,176,192,221, 49,239, 10,148,183,213,170,181, 32,235,250,199,191,
-221, 82,198,218,150, 44, 99,149,  8, 47,231,115, 82,116,123, 33, 33, 99,245,124,197,  1,245,  2,  5, 76,161, 21,200,109, 89, 17,
-120,196,243, 66,182,241,235,242,115,248,230,212,150,159,  0, 20, 75,177,187,140,107, 96, 84,144, 47,127,214,254,213, 71, 92,142,
-188,133,165, 87, 88,188,111,163,220,131, 34, 82,188,178,195, 45, 30,162, 83,129,125,183,254,229,155, 35,254,149, 44,181, 16, 93,
- 98, 43,108,234,124, 71,131,227, 56,146, 92, 92,117,151,229,186,144,133, 60,164,132, 37, 40, 26,237, 66, 71,221,  4,245,214,169,
- 93,188,231,226, 38,140, 40,106, 42,  1,224,160,  1, 64,  2,128,  8, 37, 35,160,181,  0, 29,  0, 83,114, 78, 53,141,228,208, 76,
- 44,131,119, 35,196,211,169,209,109,171,189, 38,169,107, 52, 86,181, 80,201,113,123,215,136,189,163,214,221,210,220,207,109,251,
-159,140,226,153,223, 75,185, 22, 41,197, 42, 26,  4,248,183,240,169,189, 28,  3,218,147,252,198,188,251, 87,251,119, 81,105,214,
-223,110, 62,159, 49,232, 90, 79,220,122,123,170,151, 59, 18,244,121,204,225,227, 92,132, 43,105,197,202,191, 79,238, 87,111,174,
-213,147,250,102,170,191,241,203,255,  0, 22,108,126,167,164,165,123,216,127,228,139,204, 55,166,220,139, 40,226,126, 33,175,130,
-142, 79,137, 78,106,187,123, 18, 63,158,181,116,191,183,181, 55, 93,103,216, 93,124,124,198, 78,175,247, 22,154,210,164, 59,111,
-171,135,156,236,220, 87,136, 99,248,212, 80,212,116, 93,211,171,142,171, 85,169, 93,228,215,160,104,180, 54,180,144,201,  5,227,
-124,217,231,154,221,117,221, 92,243,220,126, 37,201, 26, 90,190, 80,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,
-  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64, 30,122,228, 63, 41, 28, 47,146,102,231,231,242, 57,204,227,211,242, 79,185,
- 42, 67,138,145, 20,221,110,168,168,129,120,166,201, 29, 18, 59,  6,149,185,111,121,187,  8,168,168,198,139,169,251,206,126,238,
-199,102,228,156,165, 41, 85,245,175,113, 91,252, 22,250,127,255,  0,215, 25,175,251,252, 79,254,107, 82,126,185,127,162, 62,103,
-239, 35,254, 63,167,255,  0,116,188,235,255,  0, 73,105,198,254, 82,248, 79, 24,207,227,121, 20, 28,174, 89,201,152,185, 13,203,
- 97,183,158,140,166,212,182,148, 20,  2,130, 99, 36,145,166,182, 80,168,174,239, 23,174, 65,193,168,209,170,115,247,147, 89,217,
- 44, 90,154,154,114,172, 93,120,175,113,160,201,252,187,113, 76,151,168,201,245, 49,204,134, 69, 57,177, 45,137,198, 58, 93, 99,
-225,124,216,201, 66, 82, 54,150, 10,246,144,129,127,218, 95,219, 80, 71,114,184,172,247, 52, 89,105, 78,117,245,147,203,107,181,
- 43,253,245, 94,106,215,149, 48,242, 29,133,  9,218,128,158,225,106,203, 53,206, 79,234,111,160, 60, 91,213, 14, 77, 11,149,102,
-103,100, 35,100, 32,198,106, 27,109, 67,113,132, 50, 91, 97,231, 30, 73, 80,113,151, 21,184,169,213, 94,202,233,106,211,211,110,
- 55, 52,240,112,138, 84,110,184,215,222,101,106,246,203, 90,155,138,114,110,169, 83, 10,120,250, 14,171, 29,175, 37,148,181,215,
-104,181,102, 26,167, 39,245, 55,229,219,129,250,151, 49, 89,137,109,187,140,207,172,  0,238, 70,  2,146,133,187,180, 88,121,168,
- 90, 84,133, 88, 11, 94,193, 93,151,173, 61, 46,229,122,194,202,177,143, 67, 50,117,123, 93,157, 67,204,240,151, 74, 48, 88, 15,
-147, 94, 25,143,158,220,172,206, 78,102, 90, 59,100, 43,225, 20, 81, 29,165,219,177,126, 88,222, 71,245, 86,154,187,115,123,189,
- 37, 72,165, 18,141,173,130,204, 93,100,220,186,184, 30,142,198, 99, 33,226, 33,179,  2,  3, 40, 98, 43,  8, 75,109, 52,218, 66,
- 16,132, 32, 89, 41, 74, 69,128,  0,116, 21,128,219,110,175,137,209,198, 42, 42,139,129, 50,144, 80, 80,  0,160,  1, 64,  2,128,
-  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  8,113,150,158,
- 27, 94,109, 46, 39,185, 96, 40,125,180,181,  3,143,103,184, 30,103, 15, 49,105,194,165, 82,241, 14,146,168,205,249, 75,121,198,
-  1,234,217, 40, 80, 59, 71,232,220,116,210,245,126,221,212,214, 44,130, 81, 42, 79, 20,229,146,136,100,198,125,166,215,162,252,
-184,206, 52,178, 15, 96,113,106, 33, 55,239,181,253,213, 47,121, 30,145,180,103, 84,226, 28, 74, 55, 27,136,146,164,164,206, 82,
- 66, 84, 82, 60, 45,160,126,130, 61,157,231,182,168,221,187,155,135,  2,104,198,134,154,160, 30, 10,  0, 20,  0, 40,  0, 80,  0,
-160,  1, 64,  2,128,  5,  0, 17,  0,232, 69,232,  1, 30, 75, 71, 93,131,234,160,  5,165,  9, 79,221,  0, 80,  1,208,  0,160,  1,
- 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,
-128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,
-  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,  0, 20,  0, 40,  0, 80,  0,160,  1, 64,  2,128,  5,  0, 10,
-  0, 20,  1,228,  5,124,243, 88, 95,253,130,253,239,248, 26,230,214,245,253,159, 87,192,235,223,237,223,196,250,126,225,179,243,
-217,111,247,  7,247,199,224,105,223,172,127,103,167,224, 49,254,223,252, 79,167,238, 27, 63, 62,  4,127,252,127,251,227,240, 52,
-239,213,255,  0,179,211,240, 27,250,  7,226,125, 63,112, 95,199,145,255,  0,213,255,  0,239,143,192, 82,254,175,253,158,159,128,
-126,131,253,255,  0, 79,196, 63,227,199,255,  0,235,255,  0,223, 31,129,163,245,127,236,244,252,  3,244, 31,196,250,126, 34,135,
-207,117,255,  0,220, 15,223, 31,129,166,254,177,253,158,159,128,191,160,126, 39,211,247,  7,252,118,127,128,127,124,126,  6,147,
-245,143,236,244,252,  5,254, 63,248,159, 79,220, 31,241,216,127,234,  7,239,143,192,209,250,199,246,122,126,  1,252,127,241, 62,
-159,184, 31,199, 97,255,  0,168, 31,190, 63,  3, 71,235, 63,217,233,248,  7,241,255,  0,196,250,126,225, 39,231,180,143,247,  3,
-247,199,224,105,127, 88,254,207, 79,192, 79,227,255,  0,137,244,253,194,127,143,  3,255,  0,171,255,  0,223, 31,129,165,253, 95,
-251, 61, 63,  1, 63, 64,252, 79,167,238, 32,229, 63,226,  5,249,108, 95,136, 30,157,249,203, 43, 13,161,191,206,182,220,155,158,
-191,  0,122, 91,186,172,216,220,123,201, 83, 45, 60,191,  2,174,167,104,238,161,155, 61, 93,120, 83,226, 86,199,255,  0,136,199,
-154,239,150,231,166,165,177,250,195, 57,187,255,  0,203,133, 90,158,170,138,169, 84,167, 29,  5, 93, 28,169,228,248,150, 14,127,
-196,  9,192,155,183,233,206,254,208, 63, 59,181,199,255,  0,119,154,170,183, 21,206, 62,159,129,103,244,175,238,244,124, 72, 31,
-255,  0,162,164, 21,  5,122,107, 98,147, 98, 63, 60,185,255,  0,240,234,179,249,190,162, 47,211,191,187,209,241, 29,115,254, 33,
-251,108, 91,244,220,173, 36, 94,255,  0,157,218,199,187,255,  0,163,205, 49,107, 58, 87,164,146, 91, 90,229, 58,249, 62, 35,103,
-254, 34,193, 42,  9, 87,166,196,  3,212,140,221,237,251,190,159,249,174,175, 72,207,211,113,249,189, 31, 19, 71,197,254,122,135,
- 42,200,179,139,137,193, 90,143, 37,243,102,195,249,189,161, 71,184,127,168,106, 79, 96,172,173,118,243,249, 91,110,114,182,218,
- 93, 15,224, 93,211,236,138,236,178,247,148,242,124, 78,156, 62, 97, 50, 97, 37, 75,226, 40, 27,126,246,220,158,224, 63,240, 81,
- 92,167,243,187,124,173,125, 95,105,176,191,105, 39,255,  0,189,244,125,196,152,126,191, 63, 53,241, 29,158, 50, 10,192,  5,197,
-124,119,129, 55,239, 38, 48,214,162,185,251,245, 65, 85,216,250,254,193, 95,237, 36,151,252,223, 71,220, 88, 79,245,189,184, 42,
-242,213,135,109,110,233,185,177, 54,196, 18, 46, 47,251, 10,130, 31,255,  0,160,185,127,248,255,  0,255,  0, 39,216, 50, 31,180,
-220,149,123,223,163,238, 51,217, 47,153,116,226,138,126, 35,139,168,165, 70,201, 90,103,  2,147,255,  0,131,245,173, 11, 63,189,
-123,222, 22,126,191,176, 89,126,211,167,254,239,209,247, 15,197,249,147,129, 32, 39,118, 21, 13,173,118,216,143,142,221,123,251,
- 68,123, 10,142,127,189,167, 31,255,  0, 29,191,251,254,194, 23,251, 94,159,251,191, 79,220,101,185,183,205,204,238, 34,219,174,
- 51,192,149,144,242,217, 83,192, 28,160, 99,113, 65,185, 78,145, 28,253, 27,144,126,138,215,219,127,117, 67, 86,210,112,201,141,
- 62,106,255,  0,242,162,134,171, 97,118, 98,218,158,108, 63,219,241, 51,188, 95,231,178, 47, 32, 90,155,149,193,213,  1, 65,191,
- 49, 63,248,212, 61,125,  9,215,253, 77, 26,123,117,173, 93, 94,238,236,112,134,111,251,190,209,154,125,147,189,141,115,211,254,
-223,136,254,107,231,133, 56,157, 91,224,134, 74,118,111,221,249,174,193,107,129,255,  0,196,149, 81,105,183,206,247,140, 41,255,
-  0,119,192,124,246, 44,175,254, 79,167,238, 39, 96,190,115,209,156,195, 77,203, 55,195, 91,101,112,133,204,101,101,238, 86,123,
-146,175,130, 23, 58,244,181, 23,183,183,110, 84,118,240,255,  0,171,224, 36,118, 53, 47,235,250,126,226,161,207,158,230, 26,157,
- 30, 42,248, 45,217,120,  5, 45,228,229,238, 81,127,232,252, 16,191,215, 82,173,225,184, 57, 40, 98,191,187,224, 58,123, 18,140,
-146,239, 62,159,184, 87, 46,249,233, 71, 25,106, 52,168,220, 15,243,  8, 50,128, 45,188,114,225,147,220,110,145,  9,206,135,219,
- 70,131,121,252,203,113,112,202,227,215, 95, 98, 42,234,118,142,229, 39,158,169,245,124, 76,227, 63,241, 21,101,114,153, 97,239,
- 78,188,166,158, 59, 67,199, 55,112, 20,122, 92,126, 94, 52,189,105, 75, 86,212, 91, 81,171, 92,171,240, 42,195, 67, 23, 53, 23,
- 42, 39,206,159, 19, 64, 62,122,201, 81, 74,184,  6,210, 63,242,199,224,107, 55,245,159,236,244,252, 13,117,251,127,241, 62,159,
-184,117, 63, 60,170, 80, 36,112, 45,  7,254, 88,252, 13, 49,239,116,254,143, 79,192,122,253,187, 95,253,207,167,238, 22,159,158,
- 21,155,127,250, 11,247,191,224,105, 30,248,191,217,245,124,  7,127, 27,252, 79,167,238, 28, 31, 59,138, 63,238, 39,239,111,193,
- 83, 63, 94,254,207,171,224, 59,248,215,226,125, 63,112,161,243,180, 79,251,139,251,219,240, 84,159,175,127,103,213,240, 23,248,
-207,226,125, 63,112,127,198,194,191,234, 39,239,111,193, 82,126,191,253,159, 87,218, 47,241,159,196,250,126,225, 99,231, 88,159,
-247, 27,247,183,224,169, 63,144,126, 31,213,246,139,252, 99,241, 62,159,184, 87,241,166,127,234, 55,239, 95,193, 82,127, 33,252,
- 63,171,237, 23,248,191,226,253, 63,112,147,243,173,111,247, 31,247,175,224,169,127,144,126, 31,213,246,136,255,  0,108,126, 47,
-211,247,  8,254, 54,127,192,223,189,191,  5, 75,250,255,  0,225,253, 95,104,159,198,127, 19,233,251,131,254, 54, 63,192,223,189,
-191,  5, 71,235,255,  0,135,245,125,161,252,103,241, 62,159,184, 74,190,118,138,127,220, 91,255,  0,231,111,193, 82,173,251,240,
-254,175,180, 71,251,103,241, 62,159,184, 49,243,178, 79,251,139,111,252,237,248, 42, 63, 95,254,207,171,224, 31,198,127, 19,233,
-251,131, 31, 59, 10, 39,255,  0, 65,116,255,  0,237,111,193, 82,126,191,253,159, 87,192, 95,227, 63,137,244,253,194,191,141,111,
-240, 63,239,111,193, 82,127, 32,252, 63,171,237, 23,248,199,226,253, 63,112, 63,141,111,240, 63,239,111,193, 81,252,131,240,254,
-175,180, 79,227, 31,139,244,253,192,254, 53,191,192,255,  0,189,191,  5, 71,242, 15,195,250,190,208,254, 49,248,159, 79,220, 15,
-227, 91,252, 15,251,219,240, 84,127, 32,252, 63,171,237, 23,248,199,226,253, 63,112, 63,141, 95,240, 63,239,111,193, 81,252,131,
-240,254,175,180, 63,140,126, 47,211,247,  7,252,106,255,  0,129,255,  0,122,254, 10,143,228, 31,135,245,125,161,252, 99,241,126,
-159,184, 31,198,175,248, 31,247,175,224,168,254, 65,248,127, 87,218, 31,198, 63, 23,233,251,129,252,106,255,  0,129,255,  0,122,
-254, 10,143,228, 31,135,245,125,161,252, 99,241,126,159,184, 31,198,175,248, 31,247,175,224,168,254, 65,248,127, 87,218, 31,198,
- 63, 23,233,251,129,252,106,127,129,255,  0,122,254, 10,147,249,  7,225,253, 95,104,191,197,255,  0, 23,233,251,129,252,106,255,
-  0,129,255,  0,123,126, 10,143,228, 31,135,245,125,161,252, 95,241,126,159,184, 31,198,175,248, 31,247,175,224,169,127,144,126,
- 31,213,246,135,241,127,197,250,126,224,127, 26,159,224,127,222,191,130,164,254, 65,248,127, 87,218, 31,197,255,  0, 23,233,251,
-129,252,106,255,  0,129,255,  0,123,126, 10,143,228, 31,135,245,125,161,252, 95,241,126,159,184, 31,198,173,191,220,127,222,191,
-130,165,254, 65,248,127, 87,218, 39,241,143,197,250,126,224,191,141, 93,127,244, 31,247,183,224,168,254, 65,248,127, 87,218, 31,
-198, 63, 23,233,251,129,252,106,255,  0,129,255,  0,123,126, 10,143,228, 31,135,245,125,161,252, 99,241,126,159,184, 31,198,183,
-248, 27,247,183,224,168,254, 65,248,127, 87,218, 31,198, 63, 19,233,251,129,252,107, 31,250,141,251,219,240, 84,127, 32,252, 63,
-171,237, 19,248,199,226,125, 63,113,227, 37,244, 21,134,142,165,140, 40, 84,136,141,141, 20,222,157, 81,148, 18, 17, 75, 81, 40,
- 40, 34,138,133,  5,132,211,106, 61, 33,192,130,105,181, 29, 65, 97,190,211, 77,168,228,128, 90,246, 81,152, 50,132,166, 72,236,
-161, 72, 71, 18, 51,131,109, 74,136,165,129, 65,146, 90, 31,158,196, 77,194,236,164,188,180,158,245,104, 62,193, 90, 86, 83,140,
- 28,186,112, 49,181, 87, 19,184,163,209,137, 84,234, 26, 37, 79, 48, 58, 43, 81,238,171,145,111,131, 41,198,143,129, 97,140,145,
- 29, 43, 72,117, 64,167,179,119, 65,236, 34,171, 95,132,154,192,177,110,137,226, 92,189,197,155,204,182,226,177, 73,  3, 32,218,
- 74,252,144,175,190,144, 47,116, 95,175,180, 85, 24,235,157,150,179,252,175,159,188,182,244,202,234,110, 31, 49,152,111,226, 32,
-191,228, 75, 70,213, 32,234, 22,157, 52, 61,160,253,181,172,242,206, 53,137,158,179, 65,209,150,115, 96, 69,152,203,153, 56,  1,
- 45, 54,146,  4,168,160,234,218,148,108, 20,128, 77,202, 15,217, 85, 45,221,148, 26,132,177,232,125, 62, 62,178,213,216,198,105,
-206, 56,116,174,143, 23, 81, 94,194, 85, 18, 74, 92,109, 68, 20, 89, 73, 82, 77,136, 32,245,189, 89,147, 83,141, 25, 90, 47, 44,
-143, 69,250,107,235, 27, 51,155, 70, 31,146,128,172,128, 72,110, 36,165,125,215,143, 64, 23,208,  7,  7, 97,232,125,253,124,195,
-121,253,188,224,251,203, 63, 47, 53,209,226,234,245, 29, 54,139, 95,157,168, 79,  7,211,210,111,115, 89, 57,120, 23,131,178, 82,
-166,218, 88, 42,  9, 70,160,116,178,180,239,246,215, 59,166,179, 27,234,139,137,209, 69,170, 84,226, 62,171,243,142, 67,  7, 51,
-  7,144, 97,156,121,216, 62, 79,149, 49,157, 75,100,165, 87,220, 45,219,110,218,239,182, 45,178,196,237, 74,213,196,148,171, 84,
-115, 91,190,186,254,154, 81,185,106,174, 60,209, 63, 17,207,178, 60,203, 22,208, 97,192,228,116, 91,114,174, 55,165, 67, 91, 42,
-250,220, 85,125, 70,213,111, 71,113,213, 98, 79,165,220,214,166, 53, 70,167,141, 75,125,217,255,  0,  9,146,  5,135, 71,137,177,
-107, 37, 64,244, 82,107, 31, 91,110, 42, 25,161,138, 52,161,218,173, 75, 94, 65,198,114, 11,135,151,152,204,207, 44, 61, 29,105,
-109, 79,221, 64,237, 73, 58, 94,228, 85, 77, 38,182, 10,112,139,143,  7,200,163,169,179,131,167, 65,229,188, 36,133,227,231,167,
-114,205,154,119,107,155, 78,155,  9,240,216, 31,125,122,238,166, 10,228, 60,104,228,244, 23,114, 58, 62, 78,135, 65,203,201, 38,
- 36,103, 93, 23, 14, 37,198,202,142,166,194,221, 10,108, 52,214,185,203, 48,237, 58,117, 27, 55,228,147, 76,163,225,217,161,  2,
- 76,248, 78,110, 68, 89, 32,134,246,139,128,180,155,167,175,101,106,107,108,230,130,124,202,154,121,246,240, 42,243,222,116,105,
- 87, 73, 41, 90,213,184, 42,214, 55,235,167, 90,151, 75, 73, 68,102,166,109, 92,161, 95,145,200,187, 54, 58,217,149,227, 36, 27,
-172,220,221, 93,110,125,181,102,205,149,  9, 86, 37, 13, 68,234,154,102,109,107, 14,176, 91,237, 29, 43, 81, 42, 74,166, 60,222,
-104,157,  7,138,228,211,147,197,183,231, 29,210, 34,217,167,143,105, 31,162,163,244,105, 92,222,186,207,117,113,211,132,177, 71,
- 93,182,106, 59,235, 42,188, 99,131,246, 26,102, 35,168,235,209,  7,178,178,101, 51,106, 49, 37, 37,155,118, 84, 46, 68,170, 35,
-169,106,152,228, 61, 68,113, 13,142,132, 83, 91, 21, 33,208,216,238,166, 84,125,  5,132,123, 41, 42, 45,  0,166,148, 69, 10, 65,
- 65,  5,155,246, 83,179,  8,226, 54,227, 90,104, 61,244,170, 67, 92, 70, 54, 44, 92,129, 82,213, 17,209,134, 16, 78,164, 82, 84,
- 90, 10,181,143, 74, 64,160, 53, 20,  0,  9,183, 83, 64,  5,184,158,148,180, 10,135,173, 32,  2,128, 12,  3, 72, 45,  3,218,170,
- 42, 20, 96,216,174,234, 42, 20,  6,210, 59, 40,168,180,  5,168,  0, 80,  0,181,  0, 11, 80,  0,181,  0, 11, 26,  0, 22, 52,  5,
-  1, 99, 64,  2,198,128,  5,168,  0, 90,128,161, 67,109, 43, 68,160, 54, 83, 78,168,193, 59, 41,106, 20,  6,223,101, 21,  0,195,
-102,146,162,208,117, 13, 19, 77,114, 28,162, 62,150, 64,168,220,135,168,139, 13, 14,237, 41,185,135, 80, 80,110,196,119, 82, 84,
- 90, 10,117,177,176,210, 69,226, 43, 69, 60,160, 18, 10,149,162, 83,114, 79,112, 21,118,  5, 43,152, 28,242, 81,122, 92,183,166,
-139,128,181,105,253, 81,160,251, 43,166,133, 33, 21, 19,145,186,157,201,185,244,151, 80,100,195,150,193,105,208, 27,121, 34,214,
-233,186,168,221,132,225, 42,174,  5,251, 51,132,163, 71,131, 18,188, 42,148, 60,214, 85,123,157,  7,178,149,106,121, 48,118,107,
-138, 38, 99,178,146,113,142,  8,210, 46, 18, 53,109,119, 32,131,236, 53,  5,235, 17,186,170,130, 19,148, 29, 25,123, 41,113,121,
- 28,119, 91,152,189,185, 84, 39,115, 15,237,254,244,  1,170, 73, 23, 37, 93,215,172,232, 41,105,228,156,126, 78,107,160,209,162,
-191, 22,159,205,203,172,195,173,114,241, 79, 20, 30,169,240,139,139,164,142,208,111, 93,  2, 81,186,170,100, 60,214,222, 38,155,
- 26,204, 12,196, 82, 82,160,214, 77,100, 32, 68, 13,217,  4,118,168, 40,171, 67,236,172,187,210,157,153,116,199,164,209,133,152,
-221,142, 24, 75,160,170,145, 21,252, 84,128,  9,186, 73,241,  3,166,211,221, 86,225,114, 55, 98, 84,148, 29,183,137,218,189, 62,
-231,209,243,168, 71, 22,229, 14, 40, 54, 83,229, 69,146,181,120,210,122, 32, 18,174,238,250,224,247,109,170, 86, 31,127, 97,120,
-215,172,234,180, 26,236,235, 36,248,151, 60,150, 28, 72,108, 43, 21,156,133,177, 40,240, 49, 57,180,221,144,177,211,120, 26,130,
-123,234,142,138,228,167, 46,242,212,188,113,231,228, 52,117, 42, 50,141, 36,176,233, 57,124, 78, 43, 37, 25, 55,242,220,113, 41,
-111, 37, 12, 23, 95,199,167, 68,202, 74,117, 54,  3, 77,196,123, 43,173,185,174,139,182,173,222,249,101,130,151,251, 78, 58, 90,
- 39,110,227,157,172, 26,226,186, 78,214,153, 16,231, 97,161,103,113,170,113,245,134,155, 42,105, 77,236,113,  4,253,228,216,244,
- 41, 61,107,131,112,157,187,178,181, 58, 44, 95, 60, 14,167, 77,113,202, 42, 84, 47, 22,236,140,214, 36,176,166,130, 66,134,215,
-148,173, 78,195,220, 63,150,179,212, 99,102,237,106, 90,189,  4,209,229,190,123,  1,172, 95, 39,146,134, 91, 75, 13, 52, 85, 25,
- 72, 79,221, 87,132,184,133,233,214,254, 33, 94,185,181, 93,119,116,233,183, 86,241,246, 52,112, 58,168, 43,119,221, 56,112,246,
-146,161,229,140,238, 58,140, 98,210,219,175,197, 82,164, 50,160, 84, 86,162, 19,101, 36,218,221,134,226,155,114,214, 75,185,184,
- 38, 94,140,251,203,125, 44,202, 67,156, 98,203,186,173,107,238, 66,237,173,239,222, 61,213,171,114,214,104,148, 44,221,203, 34,
- 86, 82,119,196, 56,151,214,155,221, 34,215, 61, 20, 59, 77, 67, 98,214, 85, 65, 53, 55,107, 42,148,238, 74, 75,183,  3,175, 91,
- 85,229, 10, 20,238, 93, 82, 43, 45,229,186,164,157, 53,211,220,106,223, 20,103,112,109, 23,156, 38, 67,208,249,  3,108,173, 10,
-248, 57,191,176,115, 67,107,171,238,159,161, 85,159,185, 65, 78,195,107,140,113, 52,118,139,178,183,168, 73,252,178,195,221,233,
- 59, 72,199,190,129,111, 41, 86, 26,125,211, 92, 31,122,159, 51,209,187,182,130, 44,148, 18,149, 36,133, 14,194, 44,105,115, 84,
- 40, 45, 45,253,180,214,199, 80, 95,147,122, 76,194,208,  1,165, 14,157,148,102, 65, 65, 64, 47,180, 83,112, 20, 88, 65, 58,154,
- 74,139, 65, 91, 47,165, 37, 69,160,130,215, 96,165,204, 37,  6,150,193,236,233, 79, 82, 26,226, 36, 53, 96, 62,202, 92,194, 80,
- 50,205,207,182,140,194,208, 79,195,147, 75,156,110, 80,190, 20,253, 20,103, 12,130,190, 27,254,122, 76,226,229,  7,195,142,234,
- 51,134, 80,254, 25, 61,212,153,195, 32,127, 14,  1,208, 81,156, 92,161,134,109,208, 81,152, 50,134, 26,191,186,147, 48,180, 21,
-228,166,147, 48,185, 65,228, 95,179,232,163, 48,101,  8,199, 22,233, 70,113, 50,137, 49,199, 96,165,206, 38, 81, 37,131,216, 41,
-217,132,202, 32,181,110,162,151, 48,148, 11,103,178,150,162, 80, 45,148, 84, 40, 30,218, 42, 20, 11,101, 45, 66,128,217,236,162,
-161, 64,109,246, 81, 80,161,159,218,118,244,173, 42,153,244, 16, 82,111, 75, 81, 40, 22,223,170,150,162, 80, 82, 91,246, 83, 91,
- 21, 33,212, 53, 77,114, 30,144,240, 74, 83,107,211, 42, 58,131,225,  9,219,165, 71, 82, 74, 14,  6,239,225,236,166, 84,117,  4,
-173,  1, 58, 10, 84,196,104, 67,164,  4, 88, 83,163,196, 73,112, 51,220,129, 95, 15,139,150,229,252, 91,  8,  7,250,218,127, 61,
-105,233, 22,107,145, 70, 94,181,229,179, 39,212,101, 48, 11,139, 37,223,133,148,  0, 10, 54, 73, 61, 43, 99, 84,165, 21,154, 39,
- 61,163,148, 91,164,129,200, 48,110, 99,158, 14,199,241, 52,117,184,236,163, 73,169, 87, 21, 31, 18, 77, 94,159, 35,205, 30,  3,
-220,127, 40,133, 60,152,210,214,  0,189,129, 38,215,239, 21, 30,174,195, 74,177, 34,177,122,174,140,233, 25, 78, 53,132,202,241,
-143, 63, 28,246,236,178, 45,104,193, 55, 89,  6,247, 82, 79,112,238,174, 94,198,178,245,173, 69, 38,187, 61, 38,212,237, 70,118,
-232,184,156,193,185, 89, 28, 92,132,180,255,  0,129,246,149,160, 61,213,214, 59,118,238,198,171,131, 50,161,114,118,221, 37,196,
-159,144,117,156,155,  9,117, 40, 22, 55,220,145,213, 38,171,218,139,180,232, 90,189, 40,220, 85, 72,169,134, 30,129, 41, 42,109,
-106, 66,183,120, 72,189,206,189,132,106, 13, 92,185, 75,145,197, 20,173, 73,219,150, 12,232, 47, 50,172,142, 41, 57, 87, 99,  2,
- 10,190, 30, 67,131,169,176,208,237,246, 91,173,115,169,247,119, 50, 39,214,141,201,201, 92,142,102,177, 51,145, 24, 68,105, 33,
- 94,105, 76,117,159, 18,130,119,169, 42, 26,141,186,232,116,182,181,163,114, 78, 81,225,137,155,110, 74, 50,226,118,126, 37,206,
- 49,249,204, 82,120,239, 38,125, 13,202,254,234, 22, 69,208,124,151,145,208, 50,253,193,  3,167,133,119,174, 35,112,219, 39,102,
-231,125, 97, 97,253, 81, 92, 87,247, 71,218,142,155, 73,171,111,179, 46,  6,199, 15,194, 33,196,117, 82, 99, 72, 74, 30,104, 27,
- 37, 65, 73,113,179,221,112,  8, 82,123,171,  7, 81,185,206,107, 44,150, 15,211,238, 52,251,168, 44, 81,103,137,194, 75, 75,206,
- 58,148, 37, 65,119, 89, 66,122,117,238,176,235,214,170,106, 53, 49,105, 34,116,161, 20,107, 49, 88,116,  6, 60,213,182,227,123,
-201,  1,  4, 94,254,203, 10,198,191,168,117,165, 81, 82,237,195,145,250,241,233,204,180, 67, 79, 41,198, 33,148, 71,140,128,185,
- 65, 73,  9,117, 78, 32,238,110,193, 90, 30,155, 72,246,215,105,251, 91,120,139,151,113, 54,234,248,116, 83,153,205,110, 48,204,
-179,174, 71,154, 33, 77, 48, 50, 74,242,194,118,238,243, 27,212,144, 82,189, 69,251,197,141,122,181,203,125,229,188, 76, 43, 87,
-178, 77,208,129,145, 89,109,253,195,165,247, 38,218,  1,122,177,101, 86, 37, 91,147,113,149, 70,132,165, 62,146,  9,247,246, 83,
-251,188,172,142, 87,115,145,208,176,151,200,190,134,164,106,168,129, 74,140,182,255,  0,104,151,141,141, 25,136,152,184, 10,147,
- 29,226,250,114, 47, 52, 92,124,158,196, 40, 21,109, 41,254,205, 86,252,178,184,222,105, 74,157, 11,129, 43,212,187,116,203, 24,
-215,165,146, 79,169,252,178, 58, 11,105,118, 50, 90,114,247,109, 17,155, 64,  4,246,232, 47, 81,189,163, 79, 62, 41,225,214, 75,
-250,206,162, 31,237,243, 26,156,100,207, 83,243,216,134, 50,216,222, 66,202,219,144,133,182, 88,113, 59, 84,155, 18,146,139,148,
- 40, 94,226,176,239,219,219,172, 93,118,231,105,225,205,127,169,208, 89,253, 67, 85,106, 55, 97,118, 56,242,107,253, 71,184,151,
- 59,202,206,200, 14, 43,202,219, 75,121, 88,219,153,102, 66,134,215,150,176,111,177,195,123, 40,254,170,169,187,134,217,110, 22,
-251,251, 31, 43,197,174, 94, 53,237, 36,218,247, 75,178,186,244,250,133, 73,172, 23,147,151,184,223,  4,215, 55, 83,172,160,171,
- 82, 11, 65, 64, 11, 82, 10, 30,206,148,149,  1,123,  5, 37, 69,160, 97, 34,146,162,208, 61,180,149,  1, 37,176, 69,169,106, 37,
-  0, 24,215,165, 46, 96,160,126, 64,235,106, 76,194,208, 48,192, 20,102, 10,  3,201, 22,181, 38, 96,160,101,144,104,204, 20,  8,
- 50, 55,123, 41,115,  5,  3,242, 69,206,148,153,130,130,131, 34,221, 53,164,204, 46, 81, 94, 72, 26, 91, 90,110, 97,114,135,240,
-233, 29,148,103, 12,161,136,224,223, 78,148,103, 12,161,252, 56,  2,246,164,206, 46, 80,139, 54,234, 40,204, 20, 16,166, 83,221,
- 78, 82, 19, 40,218,153,  6,156,164, 54,131,106,104,119,105, 79, 82, 27, 65,178,206,189, 41,217,132,202, 17,100, 82,230, 19, 40,
-146,207,178,151, 48,101, 18, 89, 20,185,132,202, 36,179, 75,152, 74,  5,228,154, 51,  5, 12,240, 77,146, 43, 78,166,117,  4, 20,
- 95, 78,202,117, 70,208, 48,138, 74,139, 65,196,183,115,122,107, 99,146, 30, 75,116,198,199,164, 26,153, 35, 83,173, 34,144,101,
-  2,150, 81,100,129,215,178,132,170, 43,116, 29,109,106,234,177,107,116,166, 52, 57, 49,196,132,173, 87,237,166,188,  7, 44, 88,
-195,168,241,220,244,169, 34,240, 24,209,153,229,251, 83,141,116,118, 42,194,222,219,138,213,219,241,184,140,141,202,157,211, 71,
- 51,137, 41, 81,157,  6,231,104, 53,213,220,134,100,112,214,238, 56, 51,163,226,115, 88,249,209,147, 22,109,172, 69,146,165,119,
-247, 87, 47,127, 77, 56, 75, 52, 78,150,198,162, 51, 73, 72,165,228, 56, 49,142, 90,103,193, 33,200,203, 58,237,253,  5,245,218,
-125,181,127, 73,169,239, 22, 73,113, 43,234,180,249, 59, 81,224, 72,227,220,149,248,239, 52,149, 60, 82,234,  8, 40, 89, 61,163,
-176,222,162,213,232,163, 36,240,192,102,159, 82,211, 88,151,252,170, 10, 51,168,252,221,155,  9,200, 33, 78,165,  3,194,162, 72,
-232, 70,154,246,214,118,134,235,176,251,183,242,154, 90,136,171,203, 50,226,140,214, 34, 82, 88,144, 80,225,216,146,118, 56,217,
-  6,197, 39, 69, 18, 59,107, 87, 81, 12,209,170, 42,217,184,171, 70,106,178, 28, 81, 57, 28,122,178, 88,118,212, 99,196, 71,237,
-148,148,148, 90,214,212,220,220,168, 19,173,133, 99,218,215,119,115,201,113,227, 47, 15, 49, 61,205, 61, 85, 99,200,159,194, 81,
- 50,102, 74, 62, 42, 28,116,201,146,243,126, 91,172,188,116, 61,133, 71,175, 91,233, 77,213,219,205,143, 94, 20, 44, 90,184,148,
-124,152,146, 57,175, 15, 24, 41,114, 19, 23,205, 66, 77,214,227, 79, 13,164,185,188,133,  4,148,245,212,125,  2,147, 79,168,149,
-114, 77, 98,176, 43,206, 10, 75, 52,121,148,188,110,118, 43,226, 76, 25,241,208,178,225,  9,253,181,210,139,157,  1, 27, 79,222,
- 21,103, 81,  9,165,153, 60,  5,177,117,124,188,206,221,233,127,168,144,240,185,102,184,230,110, 75,115, 48,101, 97,184,121, 98,
- 66,172,221,172, 16,181,107,253,133,125,  7,178,184, 13,247,103,119, 96,238,218, 77, 75,156,125,171,218,141, 91,122,134,227, 74,
-248,142,223,146,127,  8, 94, 74,225, 41,  9, 74,201,216,173,170, 78,131,180,139,127, 37,121,253,184,221,197, 58,151,173,202,116,
-164,139, 28, 44,156, 86, 82, 67, 80,131,202, 75,205,141,203,  1, 33, 40,247,233, 80, 93,181, 56, 98,240, 79,153, 94,243,148, 83,
-107, 19, 49,235,148,  6, 37,240, 89,204,195,112,  7, 18,146,166,148,108, 78,246,245,  2,199, 77,109,214,181,191,110,220, 86,245,
-209,120,180, 82,113,148,237,201, 62, 52, 62,116,100,110,202,219, 90, 21,114,141,200, 42,  7,245, 13,191,146,213,244,205,156, 83,
-169,198,221,147, 84,126, 24, 12,169,242,234, 60, 71, 91,105, 79, 81,163, 35,115,170, 24,140,225, 10, 32,212,147, 68, 80,144,111,
-168,164,165, 95, 65,164,138,168,147,149, 24,114, 28,243, 25,191,104, 23, 31, 69, 16, 84, 99,110,186,162, 11,234,220,208, 61,213,
- 98, 43, 18,172,221, 81,213, 61, 27,201,151, 99,100,112,203, 85,252,149, 38, 83, 35,250, 46,120, 23,111,164, 38,184,255,  0,220,
- 86,105, 40, 92, 92,240,126,195,187,253,175,168,172, 39,105,242,121,151,151,136,239,171, 24,100, 67, 56,254, 87, 17, 97,140,146,
- 30,110, 58,173,162,156,176, 42,109, 98,221,169,219,182,253,214,238,166,236, 58,135, 60,214, 37,140,104,223,139,165,121, 69,253,
-197,167, 80,112,212, 65,210,105,165,227,232,126, 67,160, 97,167, 43, 39,  5, 18, 95, 45,137, 86, 31, 16,203,125, 27, 81,  0,237,
-191,111,190,185,189, 77,174,234,110, 42,180,229,214,117,154,121, 78, 81,172,240,151, 53,209,212, 88,236, 21, 86,165,138, 10,  8,
-164,168,180, 22, 27,210,155, 81,104, 43, 96,164,168,180, 12, 32, 94,146,162,208,  1, 35, 91, 81, 80,160,123,  5,174,122,209, 80,
-160,176,209,177, 81,209,  3,170,206,137, 31, 73,166,230,  6,210, 85, 96,218, 59, 44, 71, 98,134,160,138, 42, 42,117,197,  3, 96,
-162,160, 22,193,106, 90,128, 54,107, 69, 66,130,146,216,185,164,108, 90, 10, 13,141,105, 42, 20, 22, 16, 59,169,181, 29, 65,126,
- 94,189, 41,181, 10,  0,183,160,239,162,162,208, 95,151,107, 10, 74,133,  3,242,133,172, 41, 51, 11, 64,148,216,181,168, 76, 74,
- 13,150,133,244, 20,252,194, 80,101, 77, 14,202,122,144,218, 12,169,189, 42, 68,198,180, 54, 81, 78,168,218,  3,101, 21,  0,182,
- 26, 42, 20,  8,182, 59,169,106, 37,  4, 22,199,117, 45, 68,160, 94, 85, 46, 96,161,152, 40,208, 86,181, 76,202, 13,169, 54, 62,
-202,122, 99, 67, 66,111, 72,216,169, 18, 27,110,162,108,145, 33,205,182, 35,186,155, 81,212, 29,242,183, 11,211,115, 14,202, 54,
- 26, 59,129, 35,165, 59, 48,218, 15,148, 92,130,  5,192,235, 81,212,146,129, 41,177,112,164,253, 52, 38, 35, 67, 46,160, 13,105,
-241, 99, 90, 50,220,181,187,226,100, 56,191,186,132,223,233, 36, 90,182, 52, 15,252,169, 24,251,138,255,  0, 12,155,228,114,213,
- 55,224,221,111,109,117,201,226,112,141, 96, 28,121,107,103,194,117, 77, 36,237,166, 16,155,137,181,227,185,111,142, 66,240,210,
-212,167, 35,201,181,128,241, 43,114,122, 40, 14,210, 43,  7, 89, 99, 35,239, 35,197, 27,218, 59,249,235,  9,112,101, 94,119, 12,
-246, 38, 70,244,148,173,147,226, 67,136, 59,146, 65, 54,  6,174,105,117, 10,236,105,204,175,169,211,187,110,171,129,163,225,121,
-180,190,180,194,151,101, 40,144, 26, 10,185, 10, 55,232, 77,255,  0,231,172,189,203, 76,226,179, 68,181,163,191, 92, 25,163,206,
-241,182, 93,124, 78,136,139,  7, 69,221,138, 53, 40,189,236, 71, 93, 58,253, 21,151,165,214, 53, 28,178,229,204,185,118,204,107,
-153, 17, 48, 57,167, 56,150, 89,166,167,111, 24, 57,122, 56,130,160,108, 58,116, 26, 40, 39, 90,155, 85,166, 90,187, 77,199,231,
-143,135,144,100, 46,187, 79, 31,149,155, 76,246, 43, 30,182,216,229, 60,112,252, 57,  5,  6, 75, 77,216, 41, 73,251,193,212,109,
- 62,206,206,181,139,165,212, 78, 45,217,187,143, 67,246, 23, 92, 87,204,134,185,  7, 39,107, 33,136, 18,150, 22,189,168, 66, 31,
-186,138,174,218,183, 21, 40,237,251,166,230,218,255,  0, 45, 90,181, 98, 78,226, 79,138,240,242,145, 74,145, 93, 71, 51,205, 67,
-105,192,153,208,212, 28,103, 82,128,  6,129, 33, 90, 92,142,182,189,181,  3,165,116, 58,107,141,118,101,196,204,189,  5,243, 33,
- 88,110, 72,150, 85,240,242,  2, 93,105, 95,179, 90, 79,133, 23, 36,  3,211, 80,  8, 31,163, 73,168,209,215, 21,131, 36,181,168,
- 92, 14,211,233,183,170, 18,158,204, 67,227, 57,137,104,145, 21,219, 53, 26, 75,218, 61,225, 23,218,146, 62,242,128,181,247,106,
- 71, 77,122,240,155,206,201, 21,106, 87,173,198,141, 98,210,225,225,225,192,214,177,170,237, 40,182,122,103,242, 21, 36,171,242,
-242,148,168, 50, 87,230,223, 85,  3,208, 15,105, 53,229, 75, 81, 95,155,164,185,223, 46,125, 38,111,158,240,183,115,248, 86,226,
-102, 68,136,176,208, 82,226,220, 75,150, 42,  9,  6,232, 32,118, 27,214,190,219,173,150,150,238,104,172, 95, 10,175, 72,218,194,
-234,203, 95, 49,243,231,154, 99,163,226, 57, 14, 83, 17, 25,  5, 44,196,125, 91,  9,237, 74,180, 29,167,184, 87,209,251,109,233,
- 93,177, 11,146,227, 36,112,122,200,171,119, 37,  4,184, 51, 54,149,139,123,122, 86,171, 69, 28,194, 66,182,174,253,244,180,170,
- 27, 90, 49,111,172, 41,191,104,214,155, 21, 70, 19,150,  2,  2,174,215,217,245,210,211, 17,181,192,136, 85,118,200,169,233,137,
-  5,112, 52, 28, 35,144,255,  0,179,121,133, 78, 38,201,114, 59,140,159, 14,227,115,101, 11,  3,165,238, 52,190,149,155,185,233,
- 63, 51,107, 47, 90,102,166,213,173,252,173,231, 62,152,180, 90,230, 51, 51,243, 72, 92,153,142, 43,203,117,123,128, 42,220,171,
-143,187,173,187, 59, 52,181, 83,211,233,225,101,210, 43,129,167,168,213, 79, 80,179, 73,146, 56, 30,108,241,252,226,140,215,157,
-115, 24,250, 54, 56, 83,227, 80, 81, 27,147,165,198,160,212, 91,166,155,243, 22,123, 41, 41, 34, 77,167, 86,244,215,222,118,220,
- 90,241,245,157,145,158, 77,199,221,  9, 34,114, 17,126,129,196,173, 31,202,155, 87, 15, 45, 21,245,253, 39,117, 13,195, 79, 47,
-234,243,147, 81,146,197,174,193, 19,163,168,158,128, 58,143,231, 53, 93,217,184,184,197,249,139, 81,212, 90,124, 36,188,228,193,
-123,  5, 39, 80,117,  4,106,  8, 62,218,132,176,131,  4,244,  9, 39,232,164, 22,160, 89,216, 55, 57,102,208, 58,149,157,163,235,
- 52, 44,120, 98, 53,201, 46, 36,  7,243,152,184,230,202,123,122,129,177,216, 44,148,255,  0, 89, 75,218, 62,171,213,152,233,174,
- 75,145, 94,122,171,113, 92,106, 84,171,151,170,116,180,227,248,244, 81, 42, 72, 63,182, 90,255,  0,186,108, 14,213, 47, 64, 61,
-214,189, 92, 91,126, 72,231,189, 44,171,151, 75,242, 25,139,113,157,217,228,181, 26,191, 66,241,178,197, 17, 80, 85,231,102,165,
-252,108,131,175,195,166,226, 50, 45,216, 17,250, 94,245,125, 85, 89,205,240,183, 28,171,167,155,242,251,139,209,211,174, 55, 94,
-119,232,243, 22,173,186,133, 39,195,162, 70,130,221,213, 77,197,162,250, 99,129, 64,246,211, 40, 40,160, 47, 72, 40,180,182, 15,
- 94,157,244,141,139, 65,228,180,144,  6,148,199, 33,212, 29, 12,167,183,182,163,204,199, 80, 87,146,145,161, 26,118,119,210,102,
- 97, 64,246,  1, 99,106, 42,  0,218, 59, 69, 21,  1, 91, 18, 69,133, 37, 69,  7,148, 52,  2,140,193, 65, 10,104,223, 74, 85, 33,
- 40, 52, 91, 80,185,181, 62,162, 80,142,164,144, 53, 21, 42, 99, 89, 29, 93, 13, 72,136,198,205, 56, 64,169, 64, 58,  0, 42,  0,
- 22, 20,  5,  2,219, 69, 68,161,151, 82, 52,  3,178,181,211, 51,104, 52, 81,173, 62,163, 40, 56,219,116,214,199, 36, 62, 19,107,
-  1, 81,212,146,129, 16, 82,108,104, 16,124,  1,180, 84,100,131,136, 78,227, 97,210,154,221,  7, 36, 45,127,179, 73,183,109, 53,
- 98, 43,192, 96,223,109,187, 77, 74, 48,109,196,220, 88, 10,114, 99, 90, 51,220,186, 50,151,199,114, 43, 79, 86,218,223,175,114,
- 72, 38,180,244, 19,165,248,248,204,173,202, 13,233,167,226, 57, 12, 39,208,242,124,167,149,178,227,194,174,203,251,107,180,185,
- 23, 28, 81,231,118,174, 87,  6, 33,230, 10, 10,129, 22, 35,249,233,209,149, 71,202, 34,224,204,114, 27,232,113, 42,218,164, 16,
- 82,161,165,141, 54,237,181, 53, 64,181,117,219,146, 58,140, 37,192,228,240,143,154,226, 89, 85,174,235, 40,  0,146,225,  0,  5,
-160, 17,208,144, 55,253,117,201,220, 83,211, 79, 15, 14,175,113,212,194,228,111, 64,198,100,177, 79,226,150, 30, 96,146,201, 58,
- 17,113, 98,158,191, 81,173,187, 55,213,213, 71,196,203,191,101,219,198, 38,203,142,115, 36,162, 56,248,143, 27,205,159,218,222,
-193,110, 53,182,199, 82,  8,184,183,109, 97,235, 54,234,203, 14, 30,166, 92,179,171,170,199,137,186,200,241,188,111, 39,132,204,
-136,167,114, 92, 65, 68, 87,133,138,154, 81, 29, 20,  1,  1, 61, 47,236,172, 11, 26,187,154,105,184,203,203,214,105, 56,198,228,
- 76,102,  3,151,100,120,206, 93,206, 47,147,116, 46, 18,221, 40, 75,141,237,186, 20,110,  2,133,129,  4, 42,253,157,245,185,170,
-208, 67, 83,105, 95,130,237, 80,163, 13, 67,181,115, 36,248,114, 55,248,174, 45,134,158,100, 33,233, 69,152,243,128, 12,182, 19,
-118,174,  1, 43,184, 22,208,143,182,178,109,223,147,105, 62, 49,230, 94,154,164,112,197, 28,243,145,227, 23,198,164, 77,199,184,
-240, 24,224, 66,155,  0,  5, 13,253,  8, 10, 70,239,208, 87,215,214,231, 90,221,179, 46,241,167, 78,210,240,245,153,247,123, 42,
-191,210,115,236,130, 84,210,195,204, 29,173,184,157, 71,120, 61,186,233, 91,246,157, 85, 25,147,115, 12, 80, 26,200, 41, 44,108,
-119,118,205,201, 90, 93, 79,128,161, 73, 34,196, 17,107, 29, 47, 68,172,213,224, 42,187,133, 31, 14,147,215,127, 46, 62,180,181,
-147, 96,241,142, 73, 49,175,206,163, 32, 55,  5,249, 43, 32,200,104, 27,  0,147,112, 55, 14,223,175,221,227, 31,187,255,  0,110,
-187, 50,239,236,197,228,127, 50, 95,210,252, 56, 27,218, 77, 87,125, 28,146,120,175, 73,234, 21,200,129,146,128, 21,150,144,202,
-131,119, 46,  4, 20, 45, 37, 34,253,151, 54, 61,230,184,  9, 75,188, 73,205,181, 37,195,165,249, 58,124,100,202, 50,183, 46,194,
-226,124,219,245,197,183,101,115,124,214, 90, 52,113, 27, 16,251,222, 76,102,129,185,  9,111, 68,168,157,163,239,  4,110,183,182,
-190,134,253,178,212,116,118,237,183, 89,165, 87,229,247, 86,135, 63,185,194,125,227,111,129,200,202,133,237, 93,165, 12, 10,129,
-106,  2,218,208,144,141,147, 33, 98,242, 89, 53,  6,224,198,113,226,173,  1, 72,211,235, 53, 13,203,246,237, 99, 38,145, 61,189,
- 61,203,184, 66, 45,151,206,112, 28,190, 57,  8,252,241,230,177,190,104,  5, 41,116,248,200, 63,209,208,214,114,221,109, 92,127,
-226, 78,116,232, 52,214,207,114, 43,252,146, 80, 34, 63,199,112,113,208,171,230, 74,214, 71,221, 67, 37, 66,255,  0, 88,169,163,
-171,189, 39,255,  0, 31,164,175, 61, 21,152,127,238, 87,200, 84,126, 90,215,156,148, 67,150,135,181,176,222, 11, 93,125,166,227,
-237,171,189,243,167,106, 52,244,149, 99,165, 82,146, 80,146,126, 60,  9,179, 34,228,161,134, 81, 45,165, 37,181, 27, 54,160, 66,
-155, 87,185,105, 36, 31,174,160,183, 59,115,174, 87,239, 45,106, 52,247,172, 53, 25,170, 87,135, 52,252,168,209, 98,157,202,114,
-153,241,120,206, 58, 27, 45,167,114,158, 67, 49,154,  2,234, 66, 73, 42, 90,245, 81,211, 77, 77,101,223,141,189, 44, 37,122,114,
-111,149, 91,245, 46,  6,141,137,207, 85, 53,102, 49, 75,158, 11,163,155, 54,143,122,119,204,241, 77,182,251,248,243, 33,165, 95,
- 68,131,167,118,181,133, 29,223, 73,117,180,165, 70,110,254,149,169,183,141, 20,138,108,156,126, 71,142,100, 58,238, 48,150,238,
-174,134,230,215,210,226,175,217,157,139,142,138,101, 75,214,181, 22,227, 87, 10,131,143,242,153,118,118, 26,227,188, 29,184, 90,
- 91,  5,105,  9, 73,209, 86,177,  2,215,181, 26,173, 12,112,146,106,158, 66, 61, 46,182,230, 49,164,151,156,214, 65,228,120,120,
-155,209,152,150,166, 69,137, 62, 55, 29, 80, 30,196,164,157,107, 26,238,142,236,191,227,141,124,198,151,230,224,190,121, 63, 73,
- 61,175, 81,184,211,208, 28,129,199,113,178,166,242, 39,151,182, 60,149,164, 37,144,210, 71, 82,147,127, 21, 39,233, 51,138,205,
-122, 74, 41,117,250,  4,183,175,140,166,149,180,229,228,246,152,156,130,204,137,207, 39, 54,225,105,109,157,170,134,194,183,169,
- 75,237, 42, 90, 77,133,107,218, 89, 96,187,165, 90,243,126,225,102,212,228,251,215,255,  0,108,125,172,190,194,185, 32,199, 68,
- 76,116,127,134,136, 59,  6,151,246,168,246,154,205,212,168,230,205, 55, 86,105,105,155,202,163,  5, 68,106, 97,227,213,162,159,
- 85,207,112,172,139,151,122, 13, 88, 91,233, 45,219,105, 40,176,  2,194,169,185, 84,180,149,  7, 82,144, 15, 77, 59, 41,141,138,
- 58,148, 21, 31,101, 49,177,201, 18, 16,216,168,155, 28,144,224, 65,189,169,181, 29, 65,196,161, 87,183,217, 77,108, 81,192,146,
-  7,180,118,211, 42, 40,118,  3, 83, 64,  6,  2, 79,187,178,144,  2,176, 29, 58,210,128,  8,  4, 90,128, 18, 69, 40, 13, 57,246,
- 83,208,214, 69,115, 90,149, 12,100,103,  5,234,100, 49,140, 30,182,238,167,141,  8,155, 82,136, 39,117, 45,  4,  6,234, 40, 21,
- 12, 42,138, 11, 80,239, 72, 45, 76,241, 64,181,251, 43, 78,165, 10, 13, 20,  2,108, 58,211,170, 50,130,210,144,154, 70,234, 57,
- 42, 14,142,194, 58, 83,  7,  7,176, 45, 96,246, 81, 90, 33,105, 82, 72,105,  4,127, 61, 67,153,146, 80, 82, 16, 27,  4,210, 55,
- 81, 82,160,219,170,222,108,  5, 58, 42,130, 60, 70,237,106,120,218,  5,176,154, 42, 37,  8,249, 28,120,159,141,153,  5, 67,195,
- 33,135, 26,191,181, 73, 54,251,106, 91, 55,123,187,145,151, 67, 76,138,253,149,114,220,160,255,  0,169, 52,121,189,  5,108,184,
-166,151,162,155, 81, 73,247,164,218,189, 69,210, 74,168,241,220, 98,232,249, 22,177,220, 18,146, 25, 55, 50,  7,220, 63,172, 63,
- 87,223,221, 84,230,178,227,200,187,  9,230, 84,230, 71,125,178,147,168,181,142,160,246, 26,150, 44,100,209,103,128,205, 61,143,
-146,144, 23,183, 93, 15,243, 85, 77, 86,153, 92,137, 99, 75,168,118,228,116,220,180,184,121,152,141,200, 44,164,170, 80, 66,188,
-239, 51,104,220,141, 23,185, 32,104, 78,151,246,139,215, 45,102, 18,181, 42, 87,135, 81,210,201,198,113,175, 73,206, 50, 72, 56,
-185,103,202, 80, 32,147, 96, 53,177,  7,182,186,107, 47,189,142, 38, 14,161,119,114,192,219,240,174, 92,226,159, 76, 41,107,219,
-  1,245,126,213,182,210,148,148,168,246,166,214,191,117,141, 96,110, 91,122, 75, 52,126,100,104,104,245, 46, 78,157, 36,191, 80,
-176, 17,223,104, 74,140,124,181,  1,225, 80, 77,144,164,147,187,239, 39,169, 23,251, 42, 45,171, 83, 40, 60,178,196,183,170,178,
-174,195, 14, 37,119, 31,230, 83,241,248,147,140,144,171,190,192,219, 29,229, 27,169,  8, 23, 59, 83,115,165,239, 86,117, 91,124,
- 39,119, 60,120, 62, 37,123, 58,137, 66, 25,101,197, 20,243,114, 89, 12,155,201,142, 16, 93,185, 88,100,216,170,247,208,233,219,
-245, 85,219,118, 97,109, 86,180, 35,157,217,220,236,208,131, 61,216,216, 72,191,  4,242,132,140,202,181, 12, 39, 86,153, 10,182,
-174, 43,169, 58,125,218,158,212,101,122, 89,150, 16,233,230,252, 94,242,173,217,198,194,202,251, 83,244, 47, 25,154,151,231, 41,
-127,181,121, 78, 11,220,167,162, 46, 59,128,210,181,109,209, 44, 17,153,113,201,190,211,111,212, 37,153,178,152,117, 14, 48,234,
-208,227, 36, 41,181,  3,170,105,101,110, 50, 84,107,136,206,246, 73,224,222,  7, 95,227, 30,173,114,121, 56,147,134, 68,160,211,
- 76,165, 94,105,113,229,  0, 65,234,108,163,109,123, 44,117,174, 43, 91,176,105,227,119,188,113,171,125, 71, 67,165,220,231, 40,
-229,194,168,131,205,102, 73,229,107,196, 97,113,235, 18, 36,182,133, 63, 53,109, 32,169,197, 60,225,  0,  5, 42,230,228,  1,160,
-171, 27,109,184,233, 85,203,147, 84, 79,  5, 94, 20, 66,234, 33, 61, 92,163,  8,190,182,102,229,240,204, 46, 42, 58,159,202,228,
- 74,164,167, 85,196, 96,165,107, 65,238,112,223,106, 61,197, 87,246, 86,165,189,198,237,217, 82, 16,195,165,251, 57,191, 48, 75,
-104,177,106, 46, 87, 38,240,228,188, 40,188,230,108,229,240,240,220,255,  0, 82,199,249,234, 29, 23, 33, 91,133,253,192, 86,167,
-229,238,205,118,165, 79, 17,145, 45, 86,150,219,255,  0, 29,188,221,114,100,143,246,195,144,173, 11,110, 43,226, 11, 43, 22, 82,
- 34,167,203, 54, 29,155,181, 87,219, 81,254,159, 97, 58,201,102,125,120,252,  4,123,166,161,170, 69,228, 95,219,135,167,137, 94,
-183,158,121, 74,126, 67,171,117,211,170,150,226,138,148, 79,188,222,172,168,165,130, 84, 69, 87, 41, 73,214, 77,183,214, 50,183,
-236,  8,191,178,212,245, 18, 39, 33,128,186,146,132,117, 39, 68,146,224, 74,153, 11, 62, 79, 85, 34,254, 18, 71,109,186, 85,123,
-144, 92,105,137, 98,213,199,194,184, 27, 79, 76,249, 38, 15,  7,146,159, 35, 32,234,152,158,226,  2, 35, 61,174,208,216, 59,150,
-144, 83,115,184,144, 59, 59, 43, 11,122,209,222,191,110, 42, 10,177,174, 43,175,145,209,108, 90,221, 61,155,147,119, 29, 36,248,
- 62,174,103,110,193,114, 94,115,200,217, 15, 97, 50,110, 96,184,234, 28,216,230, 90, 98,247, 89,203, 93, 35, 98,247, 37,  0,255,
-  0, 72, 19, 92,108,182,141, 44, 37,254, 72,169,203,204,151,141,172, 78,150,238,231, 43,159, 38, 11,207, 39,228, 49, 25,103,113,
-128,200, 76,188,206, 67, 35, 63,113, 34, 66, 94,216,222,227,247,188, 36,219,169,232, 52,173,155,118,229, 22,148, 33,  5, 31,250,
- 74,147,185,206, 82,151,254, 69, 63, 26,229,141,241,249,110,135, 97,183,154, 75,200, 41, 75, 50,  8, 74,211,220, 67,129, 42, 61,
-189, 44,106,198,179, 64,245, 17, 84,147,183, 78,143,112,205, 54,224,173, 54,168,166,250,203, 73, 92,198, 54, 97,118, 71,  9, 99,
-226,122,110,248,199,118,219,250,161,176, 79,215, 84,225,183, 74,202,255,  0,251, 14,159,244,175,120,255,  0,207,202,236,191,226,
-139,242,211,216, 68,115, 25,157,205, 52,136,206,198,139,137,132,147,114,212, 36, 41,181,168, 90,214, 91,138, 82,148,175,117,234,
-117,122,205,151,153, 57, 92,151,247,123, 23,  4, 75,249,107,247,150, 87, 72, 47,237,247,151, 56,158, 27,  6, 16, 31,179,222,177,
-218,106,133,253,198,115,230,104,233,246,235,118,249, 26,168,216,240,210, 64, 74, 66, 83,220, 43, 30,119,106,107, 70,221,  9,237,
-199,183, 65, 85,220,201,148, 71,210,199,125, 70,228, 58,131,129,180,138,110, 97,104, 56,148,138,107, 99,144,234, 83, 76,108, 81,
-224,158,158,202,142,163,135, 18,158,166,154,216,161,237,210,253,244, 84,  2, 82,108,155, 80,152,  9, 34,192,  1, 78, 16, 26,130,
- 41,  0, 43,139,210,138, 17,212, 29,105, 68, 25, 87, 67, 79, 67, 72,235,  3,160, 63, 77, 72,134,178, 50,135, 94,241, 82,161,131,
- 42, 77, 72,152,209,  4, 83,132,160,146,147, 75, 81,180, 16, 69, 40,129, 82,128, 47, 64, 21, 37,  6,192,158,149,114,165,106,  9,
-  8,  0,222,157, 81, 40, 40,181,185, 55,166,230,160,185, 67, 12,172, 39,173, 25,144,101, 18,148,147,165, 43, 98, 36, 73,109, 42,
-  3, 94,149, 19,100,169, 14, 17,113,106, 96,225, 59, 61,148,234,141,160,  3, 98,138,139,148, 80,110,253,148,218,139, 65,196,181,
-168, 54,166,185, 10,145,231, 94,113,133,119, 11,201,102,178,164,217,167,150, 95, 97, 93,133,183, 13,255,  0,150,189, 59,108,212,
-171,218,120,190,105, 81,249, 15, 38,221,244,174,198,166, 75,148,157, 87,148,163,101,210,133, 36,130, 65,  4, 20,145,165,136,173,
-  9, 70,166, 84,101, 70, 91, 77,201, 47, 42,241,147, 33, 40, 76,133,  1,230, 20, 36, 35,122,128,177, 81,  3, 77,199,169, 53, 78,
-221,149,105, 81,112, 46, 59,185,248,241, 43,220, 72, 26,166,172, 38, 67, 36,104, 56,254,101, 41, 87,193, 77, 90,188,133,233,116,
-157, 82,123, 20, 47,221, 89,218,189, 53,123, 81,226,104,105, 53, 63,211, 46,  3,217,136, 78,164,121,132,249,141, 29, 80,190,164,
- 19,254, 90,143, 79,113, 60, 56, 50, 91,240,243, 20, 12, 73,118, 35,193,109,171,105,191, 81,165,104,202, 10,106,140,205,140,220,
- 29, 81,209, 49,156,189, 46,192, 17,165,187,251, 75,120, 85, 96,119, 91, 91, 31,166,185,171,250,  6,167, 88,172, 14,142,206,181,
- 56,170,241, 41, 98,226, 93,228, 25,180,179, 21, 72,105,148,  0,227,203, 82,180, 66,  6,167,233,  2,175, 92,212, 45, 61,154,203,
- 23,200,173,221,187,247,112,193, 34,211, 63,203, 49,152,132, 57,132,226, 72, 10,145,183,203,149,147, 88,220,164,158,138,242,201,
-233,126,195, 85, 52,154, 11,151, 90,187,168,225,202, 62,242,109, 94,182, 22,255,  0,199,103,143, 54,115,167,208,164,149, 47,113,
- 90,201,220,181,155,146,163,222, 77,116,209,103, 59, 56,138, 67,169,113, 54, 63,123,180,210, 56,208, 69, 42,139,139,142,153,146,
-125, 49,113,236, 46, 68,133, 27, 37, 13,164,147,244,219,165, 36,239, 66,220,115, 77,209, 15,183,102,119,165,150, 10,172,233, 12,
-122, 95,  7,138,195,103, 59,234, 68,241,138,140,176, 28,143, 21,162, 28,150,245,143,221,109,176,110, 79,244,141,146, 59,235,151,
-158,247, 61, 84,157,173, 28,115,190,109,225, 21,227,126, 12,222, 91, 93,189, 52,115,234,101, 78,165,234, 50,217,143, 81, 94,218,
-236, 14, 39, 23,242, 92, 74,238,133, 44, 43,116,183,146,123, 93,112, 90,215,237, 74, 44, 59,239, 90,218,125,161, 97, 61, 68,187,
-201,253, 43,196,189,175,208, 80,191,188,206,153,108,174,238, 62,151,229,247, 24,199,164,201,147, 96,243,138, 90, 71,221, 73, 58,
- 15,112,233, 91,177,132, 99,193, 24,115,187, 57,252,206,162,152, 97, 75, 61, 41, 37, 42,  9, 24,212,178, 75, 41,109,187,147,175,
- 79,109, 85,114,171, 46, 40,164,134, 28,209, 58, 83,208,198,240, 16,134, 30,146,189,145,218, 91,202,237, 13,164,168,253,148,231,
- 37, 21, 86,232, 54, 48,148,221, 34,155,241, 11,115, 25, 53,144,163, 37,179, 26,221, 67,224,182,126,162, 41, 21,248, 75,229,117,
-241, 15,150,154,228,126,101,151,199,129, 29, 46,121,104, 87,121,169, 28,106,202,234, 84, 68,102,214,180, 58,151, 16,108,180,144,
-160,125,162,165,105, 53, 66, 36,218,117, 52,146,249,102,124,182,152,255,  0, 28,232,136,226, 66,131, 41, 81,  8, 61,134,233, 22,
-  4,214,109,189, 21,175,246,170,154,114,214, 92,141, 40,232,136,236, 57,150,148, 65, 73, 90,133,239,239,189, 62, 74,212,122,  7,
- 66, 87,174,116,147, 88,198,242, 52, 74, 18, 25,134,227,170,108,  2, 21,180,144,  1,214,171,202,245,135, 26, 57, 37, 82,104,233,
-245, 42,117, 81,110,134,179, 31,203, 64,142,166,101, 71, 76,119,209,181, 42, 46,130,158,150,  6,218, 92, 86, 53,221,  7,106,177,
-117, 93, 70,173,173,106,106,146, 89, 95, 89,125,134,229,114, 22,189,172,188, 92,105, 34,234, 18,  6,244, 91,167,133, 70,202,  3,
-233,172,237, 78,130, 41, 98,177,234,240,161,175,166,220,165,201,225,214,107,224,242,232,106,  1, 79,196, 80, 77,236, 92,142,160,
-177,167,110,213,109, 35,235,172, 91,187,124,215,  9,121,205,219, 59,156, 95,204,188,198,151, 29,145,197,228,238, 32,190,151, 28,
- 78,170,104,130,135, 64,246,165, 86, 63, 85,101, 94,179,114,215,204,189,198,181,171,246,238,252,172,176,216,  5, 86,169,100, 79,
-109,251, 41, 68,  0, 20,  0,180,139,104,116,166,177, 71,  0,166,138, 58,146, 47,122, 99, 20, 90,116,184,239,166,177, 69, 92, 31,
-117,  0,  2,  1, 23, 63, 69,  0, 17, 72,211,237,162,160, 36,167, 90, 90,128,130, 59,233,194, 13, 30,180,241,  6,141,192,167,136,
- 50,190,180,244, 48,105, 86,185,167,161, 24,209, 77, 58,163, 68,148,211,170,  2, 74, 41,106, 32,146,142,250, 90,137, 65,  5, 29,
-212,234,137, 65, 59, 13,237, 75, 81, 40, 85,218,246,190,130,213,108,174, 37, 41,220,187,118, 82,183,128,148, 28, 82, 66,109,182,
-154,152,225,206,169,183,125, 52, 81,  9, 78,213,116,165,111,  0, 67,212,193,225,128, 77,  0, 45, 45,222,154,216,180, 28, 75, 94,
-202, 99,144,180, 22, 27,166,212, 90, 11,  8,164,168,234, 24,111, 84,120,170,179, 56,100,228,226, 35,116,252,109,212, 82,145,117,
- 45,131,247,128,183,104,251,213,208,108,154,238,230,238, 73, 62,204,253,103, 55,191,109,255,  0,152,179,158, 43,181, 15, 74,230,
-112, 85,166,198,226,189, 21, 51,203,218,  2, 92, 35,232,161,160, 82, 29, 14,111, 23, 52,199, 26, 18,169, 84,108,168,161, 91,134,
-132,107, 79,165, 70, 60, 49, 46, 91,205, 62,228, 65, 29,203, 16,157, 42,139,211, 37, 42,162,236,117, 45,198,140,175,118,202,212,
-125, 53,102, 36, 19,196, 67, 47,169,  7, 97, 36,119, 82,202, 53, 35,140,233,129, 96,156,155,177,227,184, 65,178,148, 44, 79, 78,
-202,172,236,169, 73, 23, 21,247, 24,182, 85,161,197, 54,119, 27,149, 43,196,163,219,115, 86,218,169, 69, 54,177, 30, 82,252,212,
-237, 79,222,232, 45,219,236,166, 37, 70, 73,154,166,159,142,240, 12,150, 77, 95, 17, 44, 24,209, 18, 55,175,113,  8,218,143,214,
- 90,149, 96,145,239,172,157, 94,235,110,214, 17,197,248,112,233, 54,116, 91, 68,238,188,211,194, 62, 30, 98,253,254,119,  7,135,
-160, 99,120, 80,109, 83, 27,186, 36,101, 75,105, 83,101, 93,133,148,172, 18, 79,244,151,244, 10,205,142,215, 61, 99,207,169,174,
- 87,194, 53,199,203, 79, 82, 53,111,238,214,180,177,238,180,201, 87,156,189,221, 62, 51, 11,149,204,207,205, 60,244,156,131,203,
-149, 46, 65,187,210, 30, 81,113,197, 30,189, 79, 65,236, 21,208,216,211, 66,202, 81,130, 81, 75,130, 71, 49,127, 83, 43,181,205,
-139,124,202,159,133,182,157,189,106,238,114,135,118, 41,136,171,121,228, 48,202,119,186,179,100,166,146, 83, 73, 85,240, 22, 54,
-220,157, 22, 44,184,123,143,230,224, 35,204, 84,125,200, 34,254, 29,116,246, 85, 24,234,236,220,116,169,161, 45, 21,235,106,180,
- 42,158,148,180,157,174,164,161,193,212, 27,138,185, 27,107,145, 70, 87, 31, 62, 37,212,124, 11,111,192, 76,245,200, 46, 33, 71,
-196,150,135,221,190,182, 36,213,  9,234,156,103,146,148,241,154,182,244, 42,118,212,220,170,186,137,176, 24,118,  3,139, 78, 54,
- 76,134, 16,224,179,161,151, 86,141,195,173,142,194, 47, 80,221,154,154,237,164,252,105, 63, 89,106,204, 29,151,254, 57, 74, 62,
- 41, 53,234, 21, 37,236,139, 12,185,230, 79,124,199,  9,187,141, 60,242,221,109, 73, 79, 97, 74,201,  6,155,  8,219,147, 84,138,
-175, 82, 73,250,  5,157,219,145, 78,179,149, 58,219,107,204,204,203,152,201, 47,165, 42,134,218,158,222, 55,184,148, 36,217,187,
-157,  1, 87, 78,149,170,175,198, 63, 51,167,180,195,150,158, 82,249, 85,107,232, 33, 57, 14, 76,101, 35,207,105, 72, 11,213,  4,
-141, 21,110,234,177, 27,145,151,  6, 86,157,169, 67,230, 84, 58, 15,165,152,126, 49,157,206, 63,  7,147,166, 67,133, 49,156, 92,
-  6, 35,148,160, 45,244,246, 56,165,  3,100,129,226,208, 92,251, 43,154,223,117, 26,155, 22, 84,172,209,118,150,102,249, 46,164,
-116,187, 30,154,206,166,246, 75,157, 24,123, 78,218,214, 59,137, 98,150,219,177,241, 81, 35,184,210, 64, 69,247,175,196,  5,183,
- 88,171,175,109,112, 50,189,169,186,154,115,147,169,233, 86,236, 88,179, 74, 70, 42,133,238, 63,157,197,130,133, 71,121, 17,102,
- 69, 90,118, 45,153, 12, 54,161,183,216,160,  2,146, 71, 97, 74,171, 62,238,215, 41,186,172,209,125, 41,191,244, 21,206,211,166,
- 60,  6,114, 16,189, 54,229, 81, 75, 19,177,232,142,165,127,164, 65, 10, 32,158,208,161,101, 15,166,244,251, 87, 53,250, 89, 86,
- 50,175,135,155,212, 50,238,151, 79,125, 82,105, 63, 67, 57,151, 37,244,140,196,221, 43,138, 78, 83,240,212,146, 75, 11,212,139,
-118,  2, 58,215, 89,162,223,243,246,111,198,143,164,230,245,123,  6, 92,108,201,211,160,202, 48,140,246, 49, 94, 76,248,171, 32,
- 13,161,196, 38,224,  1,238,173,137, 59, 55,113,132,140,133, 11,246,157, 37, 18, 19,249,249,173,230,227,249, 62, 98, 21, 24,135,
- 15,150,162,133,146,174,227,110,234,158, 58, 72, 59, 46,180,196,169, 45,100,227,121,101,174,  7, 95,199,231,243,255,  0,151, 53,
- 57,246,148,235, 75,  0,126,221,133, 15, 31,104,243, 26,176,250, 72,174, 42,246,146,206,119, 20,233,226,126,198,118, 54,119, 43,
-170, 53,120,249, 61,197,212, 76,250, 36, 22,208,228,117, 37,215,  0, 33, 45, 45, 14,219,222, 14,210, 53,170, 23, 52,174, 53,105,
-224,186,112,247,151,237,238,145,124, 98,253, 99,241,179,216,153,114,101, 66, 98, 72, 50,161, 43,100,182,138, 84, 11,106,238, 38,
-196, 95,233,168,231,165,187,  8,169, 53,132,184,117,150,237,107,172,220,109, 70, 88,174, 36,164,228, 33, 92,  1, 37,171,158,129,
- 75,  9,189,186,253,235, 84, 46,212,250, 25,107,189,135, 74, 31,110, 83, 14,130, 90,121,165,164,117, 41,113, 36, 15,182,153, 40,
- 53,197, 63, 48,157,244, 58, 87,156,144,226, 28,105,147, 37,210, 17, 28, 88,151, 84,160, 16, 47,168,214,253,181, 18,105,188,171,
-136,238,242, 43,139, 67,109,190,203,137, 74,208,243,106, 74,134,224, 66,210, 65, 22,189,244, 38,156,226,215, 20,195,190,133, 56,
-160,191, 49,130,132,  7, 23, 41,160,218,133,210,162,174,163,191,165, 47,115, 54,233,149,140,122,155, 73, 87, 50, 30,102, 84,105,
- 59,140,119, 82,242, 80,118,169, 72, 55, 72, 36, 94,215,247, 26,100,161, 40,241, 84, 36,183,118, 55, 21, 98,234, 59,184, 91,219,
-217, 76,161, 40, 71,191,235,160,  4, 19,111,166,156, 32,210,251,169,232, 65,165, 26,114, 16,109, 93,253,180,244, 52,101, 64,138,
-122, 16, 65, 20,225,161, 90,128,  5,168,  0, 20,131, 75, 80,160,130,221, 45, 68,160,159, 44,222,150,162, 21,  4, 36,  0, 45,115,
-106,186, 86, 16,134,205,247, 29, 41,206, 66, 36, 61,180, 83, 42, 62,129,210, 10, 11, 80,  2,130,111, 72,216, 15, 33,186,141,177,
-201, 15,165, 29,212,198,199,208, 88,108,211,106, 45,  5,134,233,181, 22,130,194,  5, 54,162,208, 88, 71,101,174, 14,132,118, 17,
- 73, 81,104,112,255,  0, 82,125, 58,119, 22,235,185,204, 35, 69,120,199,  9, 92,136,232, 23, 44, 40,234, 72, 31,169,252,149,223,
-236,219,186,186,149,171,175,181,201,244,252, 79, 59,222,246, 87,109,187,182,151,103,154,232,248,122,142, 86,161,173,117,232,226,
- 90, 13, 14,109, 63,203, 67, 85, 21, 49,243,101,139,143,162,163,224, 73,196,105, 42,242,149,175, 67, 79,106,164,105,208,125, 43,
- 10,247,212,109, 18, 41, 13, 56, 44,111,210,158,134, 72, 90,182,187, 24,184, 78,163, 66, 41,171,  9, 80,125,107,  0, 61,168,191,
-103,101, 17, 18, 88,155,206, 31,199,226, 99,162, 39,146,114, 47,217,196, 73,220,202, 84, 60, 74,  0,139,165,176, 69,139,132, 27,
-128,116, 29,181,206,238, 26,185, 92,151,115,103,143, 63,143, 81,211,109,218, 24, 90,135,125,123,  5,203,225,214, 67,229,156,181,
-252,235,203,139,141, 74,161, 96,146,108,212, 66,173,203, 88, 79, 69,188,161,162,150,126,161,217, 83,232, 52, 17,176,179, 79,181,
- 62,158,142,165,208,138,250,253,198, 87,222, 88,118, 97,209,211,214,204,168,141,160, 39,237,173,124,230, 54, 64,126,205,  0,216,
-235,219, 70, 44, 29, 16,217, 82,110, 78,150,183,111, 90,122, 68,109,162, 70, 21,197, 70,148,137,169,232,133, 88, 19, 81,106, 86,
-104,229, 37,210, 60,178,204,119, 94, 46,252, 60,188, 47,132,148,148, 23, 72,187,101, 67, 83,113,208, 87,158,235,163, 59, 51,205,
- 30,  7,121,166,106,228,104,202,222, 83,233,131, 50,218,113,246,146,148,173, 34,231,244,109,238,239,171, 90, 29,237,193,164,202,
- 90,205,178, 51, 85, 57,196, 68,101, 56,100,181,  9, 44,124, 86, 41,223, 12,150,122,130,159,214, 79,113, 21,212, 92,118,245,145,
-193,229,146,224, 96, 91, 87, 52,114,199, 24, 62, 62,242,232,124, 34,  9,151,143, 88, 49, 29,  1, 65, 10, 30, 32, 21,220, 42,143,
-105,246,103,197, 27,138,210,107, 52,120, 49,248,216,248,179,136, 47,144, 80,122,  5, 11,127, 45, 71, 59,210,135,  1, 85,136,190,
- 36,174, 77,139,122, 47, 27,146,136, 10,  1, 62, 89, 81,105, 34,202, 41, 73, 10, 61, 61,130,161,209, 95, 82,212, 44,253, 34,107,
-109,211, 79, 37, 30,131, 93,242,213,232,196,158,100,243,222,161,207, 48,228,225,120,250,140,137, 16, 39,172,165, 18, 18,200,220,
-164, 95, 91,105,210,186, 61, 86,182, 22, 94, 78,108,227, 33,105,205,102,103, 56,245, 35,157, 99,102,122,157, 59,148,240,156,114,
- 48,112,144,230,214,161,183, 98,221,128,218,177,110,226, 52,169,229,167, 87,236,228,187,141, 71,216,212,203, 77,117, 78,219,197,
-122, 73,207,100, 57, 22,106, 50,114, 80, 87,231,198, 88,220, 82,209,186,209,125, 72, 41, 61,222,202,230,227,102,197,153,100,150,
- 15,172,236,165,170,191,122, 42,112,197, 50, 27, 17,121,  4,147,162,156, 23,239, 38,167,148,236, 71,160,100, 45,234, 39,205,150,
-173,197,228,240,209,116,184, 72,182,128,131, 84,229, 61, 60,223,  2,244,109,234, 96,184,139, 71, 35,229,184,245,110,110,247, 29,
-196,129,245, 82, 61, 30,150,231, 16,252,230,170,223, 35, 81,136,245,118, 40, 30, 71, 48,195, 41,192,  5,132,200,105, 71,153,239,
- 82, 21,100,171,236,172,141, 71,237,249,113,211,220,167, 84,184,121,203,214,183,212,149, 47,219,242,161,201,  7,210,174, 72,178,
-152, 89,150,162,228,222, 37,196,170, 90, 28,139,170,137, 33, 27,214,141,128,141, 19, 98,171,119, 82, 69,238, 90,117,218,182,229,
- 21,134, 20,151,150,137,212,101,203,187,118,162, 88, 53, 22,248,114,243,214,156,252,101,254, 15, 45,234, 55,  5,140,228,  8,141,
- 53,147,194, 74, 72, 45,135,155, 15,182,164,157,110,218,197,199,103, 80,106,157,239,201,234,235, 87,146, 92, 31,131,225,235, 27,
- 13, 37,228,251, 13, 77, 46,186, 63,137,154,228, 94,160, 79,126, 83,111,171,143,183, 18, 99,109,148, 23,216, 65, 66,156, 81,190,
-170, 35,173,201,171,250, 93,170, 10, 52,239, 42,186, 25, 78,245,235,144,120,219,117, 49,124, 95, 49,202,112, 51,102,100,226, 69,
-121, 79, 73,117, 78, 59,116,110, 65, 85,205,202,146,160, 65,235, 91,218,203, 58,123,209,140, 91, 93,149,129,155,162,119,225,154,
-106, 47,180,203, 53,115, 46,101,145,201,187, 54, 68, 37, 44,  4, 22, 88,101, 37, 77,180,216,190,170,176,234, 73,235, 85, 63, 78,
-210, 91,182,162,165, 78,111,165,154, 49,214,106,231, 55, 39, 30,165,225,210, 88, 99,179,188,224, 58,168,232, 75, 80, 81,123,175,
-204, 37, 40,177,189,180, 39,178,170,222,210,232,233, 92,100, 62, 31,155,156,168,232,188,102,133,249, 92,163, 54, 26,107,144,242,
-207,245, 84,  4,167,225,226,161,  9, 27, 81,247, 65,210,198,221,151,172,216,195, 79,102,174,213,156,122,100,217,163, 29, 45,201,
- 97,114,237, 23, 68, 82, 38, 51,136,227,123, 74,101,228, 37,204, 10,251,233,113,245,132, 27,245,186, 81,180, 85,121,106, 53, 31,
-211, 24,199,201,239, 47,199, 69,167,254,166,229,227,101,163, 45,113, 22,136, 45,193, 96,144,  0, 27,154,223,167,189,119,170,146,
-150,169,241,147,243,150,227,103, 77, 30, 17, 94, 98,242, 44,136,197,  1, 17, 82,150,219, 31,117,  9, 72, 74, 71,208, 52,172,249,
-194, 85,237, 23,224,227, 74, 46,  4,144,226,123,234, 42, 15,  7,152, 61,148, 80,  3,222,158,250, 40,  1, 21, 36,244,214,138,  0,
-133, 38,253,105,201,136, 54,164,138,114, 98, 13, 41, 29,180,244,196, 27, 41, 52,234,136, 17,  6,148, 64,169, 64, 42,  0, 59,119,
-210,  0,123, 69, 21, 10, 20, 65, 35, 74,208,169, 85, 33, 84,130,130,128, 20, 19,223, 73, 80, 22,148, 95,221, 77,108, 90, 15, 33,
-186, 99, 99,146, 36, 33,187,212, 77,143, 72,120, 32, 10,101, 71, 80, 88, 69, 54,162,208, 80,110,146,162,139,  8,164,168,162,130,
-  5, 54,161, 64,203,105, 80, 41, 80, 10, 73, 22, 41, 34,224,131,216,111, 69,104, 45, 14, 59,207, 61, 30, 46,173,204,183, 18, 64,
-  4,221,111,226,175,109,122,146,201, 63,251,  3,244,119, 87,111,181,254,225,162, 86,245, 30, 73,127,234,247,249,206, 19,118,253,
-185,153,187,154,127, 44,127,244,251,142, 45, 33,135,163, 58,182, 31,109, 77, 60,217, 41, 91,107,  5, 42, 73, 29, 65,  7, 80,107,
-188,132,148,149, 83,170,103,159, 78, 18,131,164,149, 26,  9,181,237,247, 26, 26, 17, 48,220,214,145,  3, 27, 67,155,116, 52,246,
-134, 38, 56, 86, 20, 61,180,202, 80,146,181, 37, 55, 33,168,241,181,109, 46, 21,  2,146, 20, 47,247,170, 39,  7, 41,113, 39, 87,
- 35, 24,112, 76,181,226, 88,182,242,217, 68,252, 81, 13,192,140, 11,242, 84,126,232, 74,117,170,122,251,238,213,190,206, 50,120,
- 34,222,223,103,189,185,143,203, 28, 89, 97,203,249, 82,243,243, 18, 16,129, 31, 29, 25,  1,152, 80,209,162, 27,109, 34,223, 74,
-148,117, 39,182,171,109,250, 21,167,134, 56,201,226,223, 75, 44,110, 26,247,126, 95,218,184, 35, 53,241, 27,123,117,173, 92,149,
- 50,179,208,105,201,157, 72,167,171, 99, 37,112,105,134,228,206,116, 50,194, 74,148,163,217,211,233,167, 73,198, 10,172,100, 33,
- 43,142,145, 47,156,225,211,203,  9, 44,171,116,149, 11,249,103, 64,175, 96, 61,245,156,183, 24,102,199,129,173, 45,170,121, 42,
-158, 36, 92,116, 69,146, 88, 32,181, 33,178, 66,219, 95,132,220,117,  4, 30,218,154,245,197,199,138, 32,211,219,174, 28, 26, 58,
-119, 14,124,197, 64, 10, 54,217,107, 41, 68, 88, 19,239,174, 79,113,142,102,117,154,  9, 36,168,201,124,139,157, 76,106, 71,193,
-178,149,121, 74, 59, 12,146, 46,128, 15, 91, 17,110,218,135, 73,182, 65,199, 51,227,208, 89,212,235,242,188,169, 97,211,200,129,
-130,110,  7, 34,117,121,  9,219,178, 13,166,237,166, 43, 75,182,213,142,244,147,122,177,170,115,211,172,145,236,117,178,181,152,
- 67, 81,219,174,101,208, 71,228, 76,199,137, 37, 43,157,228, 98, 88,108, 39,246, 46, 56, 20,179,110,228, 55,117, 84,186, 57, 74,
-113,236,214,111,197,237,100,215,239,198,218,237,210, 43,195,145, 69, 39,212, 24,144, 16, 91,195,196, 18, 31,181,132,169, 41,178,
- 19,237, 67,119, 63, 90,143,209, 90, 16,218,101,113,214,228,168,186, 23,181,251,140, 27,219,196, 99,255,  0, 28,106,250, 95,184,
-205,191,203,185, 28,231,  0,114, 82,213,115, 96,218,  5,134,189,128,  1, 90,177,219,236, 65, 97, 19, 42, 91,150,162,111,137, 38,
- 23, 45,229,220,114, 12,188,118, 34, 84,188,110, 46,120,219, 50, 42, 74,131,106, 36, 88,246, 11, 94,165, 86,237, 92,105,202,146,
-107,129, 90,231,121, 14, 78, 40,171,200,224, 50, 88,248,209,103, 76,  1, 44, 77, 23,105,194, 70,170,176, 85,187,250, 17,175, 74,
-117,173, 84, 46, 73,198, 60, 98, 62,254,138,229,152,198, 82,225, 36, 94,241,190, 89, 35,138, 69,126, 44, 84,151, 36, 72,219,185,
-195,170, 16,142,164,  4,158,164,247,214,110,179, 65, 29, 84,148,165,193, 23,244,122,249,105, 98,226,177,108,234,252, 87,147, 99,
-167,192,110, 74,139, 78, 60,173, 28,110,214, 82, 85,218, 15, 83,244,253,149,199,107,180, 87, 45,205,172,104,118,123,126,190, 51,
-138,150,  6,197,  2, 52,214,124,214,144, 10,122, 16, 64,184, 61,198,176,222,104, 58, 51,166,132,227,113, 85, 17, 94,197,199,115,
-239, 50,155,123,170,104,223,146,230, 36,173, 69,242, 43,100,241, 76,124,144, 74,152,  2,253,213,106, 26,233,199,153, 86,122, 40,
- 75,145, 81, 39,211,184, 15,164,128,157,183,236, 34,174,195,119,156, 74, 51,218, 45, 73,112, 11, 27,198,121, 95, 27,  5, 60,111,
- 49, 34, 19, 68,220,176,133,146,213,255,  0,168,171,167,236,165,189,173,211,106,127,230,182,164,250,121,249,248,149,227,181, 92,
-180,169,110, 77, 46,130,208,228,125, 68, 62, 25, 77, 65,150,239,100,135, 98,167,204, 31,247,178,129,246, 85, 78,231, 67,253, 46,
- 81, 93, 10, 94,250,147, 43, 26,164,168,212, 95, 91, 88,149,232,131,207, 16, 29, 13, 75, 12,182,253,252,214,154,101,144,130, 13,
-201,  0, 20, 27,117,239,171, 46,238,137,210,177,173, 58,223,188,111,229, 53, 53,205, 90,120,146, 33,127,176,185,233, 11, 47, 72,
-154,247,152,173, 77,156, 82, 71,119, 64, 64,169,255,  0, 83,179, 21, 69, 21,230, 19,244,203,210,117,148,223,156,146,199,167,179,
-202,193,122, 66,213,237, 82,201,254, 83, 81, 75,118,133, 48, 72,150, 59, 84,171,139,126,114,226, 47,  7,242,192, 14, 60,171,138,
-163, 61,206,188, 17,118, 27,122, 92, 89,102,207, 23,101,171,  5, 56,178, 42,172,181,173,242, 45, 71, 74,145, 57,188, 12, 80,  0,
- 37,103,233,170,239, 85, 34,101, 98, 36,248,240,209, 28, 89, 23,250,106,180,238, 57,113, 38,140, 40, 74,  8,239,168,106, 72, 40,
- 34,146,160, 30,218, 42,  0,219, 69, 64, 43, 80,  0,219, 75, 80, 18, 83, 69, 64, 34,154, 90,137, 65,  5, 20,234,137, 65,  5, 20,
-181, 16, 45,180,181,  0,108, 61,180, 84,  5,108,164,168, 20, 65, 26, 10,208,169, 84, 61,158,202, 42,  1,132, 26, 74,139, 65,105,
-110,154,216,180, 30, 67, 84,199, 33,201, 18, 80,208, 30,250,137,200,145, 33,228,162,152,216,225, 97, 20,218,138, 44, 38,155, 80,
-160,160,154, 74,139, 66,  6,115, 53,142,227,152,199,114,185, 53,148,198,108,132,165, 40, 27,150,227,138,251,168, 72,211, 83,106,
-179,165,211, 92,212, 92, 86,225,197,250, 58,202,218,173, 77,189, 61,183,114,124, 23,133, 14, 63,147,245, 79,148,230, 93, 91, 88,
- 52,163, 25, 20,125,221,155, 86,245,187,212,226,197,191,232,129, 93,181,141,143, 77,101, 86,239,109,250, 60,200,225,181, 27,238,
-166,243,106,213, 32,189, 62,118, 83, 30,101,234, 54, 49,237, 50,146, 22,190,187, 30,217, 33, 39,183,162,194,190,202,189,250,118,
-130,234,249, 23,147,  3, 55,245, 77,117,167,132,219,241,209,151,112,253,104,228,177,236,222, 83, 14,196,162, 52, 42,107,204,142,
-178,125,222, 49,246, 85, 11,159,183, 52,242,198, 23, 28,124,116,126,227, 74,215,238,123,241,255,  0,146,218,151,138,171,222, 86,
-114,159, 80, 56,143, 40,138,191,206,120,212,134,178,161,  4, 71,148,203,200, 74,194,134,128, 23, 54,  2, 83,239, 74,170,214,135,
-105,213,105,101,254, 59,201,195,154,105,250,171,237, 69,109,126,241,164,213, 67,252,182,101,158,152, 52,215,175,163,200,206, 91,
-127, 97,  0,215, 95, 67,137,168,123,238, 44,105, 40, 45, 70,207,125, 56,107, 13, 43,161,160, 76, 94,227,116,144,109, 99,113, 77,
-160,234,151, 17,178, 63,  5, 21,232,145,164, 44,174,102,212,190,  6,136, 13,167, 91,107,115,114,106,148,236,231,146,148,146,236,
-240, 47,194,247,119, 23, 24,203,230,226, 86,200, 42, 65,178,189,227,184,213,168, 98, 84,158,  3, 77, 54,244,167,  3,109, 11,168,
-246,157,  0, 29,228,246, 10,116,154,138,171, 27,  8,202,110,136,177,199,227, 14, 66, 95,229,248,246,190, 45,213,120, 76,131,184,
- 32, 19,212,161, 34,223, 65, 87,213, 85,174,223,238,227,158,111, 42,232,247,150,237, 88, 83,150, 72, 44,223,221,203,201,241,243,
- 29,191,136,250,110,246, 19, 28,169,146, 99, 37, 75, 41,220,124,221, 21, 98,155,131,180,216,216,158,138,174,  7, 95,188, 43,243,
-203, 23,230, 59,125, 22,221, 27, 48, 42,179,113, 94,129, 35,226,172, 18,132,219,194,  6,157,123,133, 91,211, 77, 92,142, 82, 91,
-176,161, 85,149,106,  6, 65,161, 49,198,195, 83, 91, 31,222,167, 66,176,  6,129, 67,182,174, 88,148,237,188,169,214, 37, 41,233,
-225,115, 23,131,233, 11, 11, 51, 28, 14,201, 78,145, 96,  9,107,239,  2,123,169,117, 54,238,127, 74, 31,102,212, 34,177,117, 46,
-165,170, 59,236, 28,148,230,145,  7,  4,207,222,148,248,216,135,109,250, 13,  3,170,212,123,147, 84, 45,169, 69,228,139,205,113,
-242, 92,186,223, 66, 39,157, 20,115, 79,179, 14,151,236,233, 57, 99,243, 25, 57,137, 47,241,181, 61, 10, 10,148,124,131,188,165,
-208,155,118,148,247,247, 87, 95, 27,111,186, 74,245, 37, 46,125,  7, 21, 43,171,190,110,205, 98,136, 18, 33,205,243, 60,233, 72,
-117, 74, 95,250, 71, 66,141,254,149, 85,136, 92,133, 41, 26,121, 10,247, 45, 92,173,100,159,148,186, 28, 99,201,138,169,114,210,
-124,164, 88, 56,165, 45, 44,167,121,253, 20, 18, 20, 84, 71,110,149, 71,243,153,165,150, 62,170,225,215,208,104,189,  2,183, 26,
-207,215, 76,122, 22, 14,164,136,248,216,156,127, 35, 10, 94, 69, 11, 24,247,238,133, 45, 67, 84,121,137, 33, 42,184,234, 47,221,
-175,217, 81, 78,244,181, 22,229, 24,124,200,179,110,196, 52,183, 99, 57,252,175, 15, 21, 87, 19,103,147,135,136, 84,246, 91, 81,
-142,238, 18, 91, 36,198,145, 17,  7,204, 74,210, 66,138, 22,173,196, 31, 15,221, 87, 67,109, 69, 97,217,185,117, 65,181, 85, 56,
-188, 84,158, 30, 53,229,229,233, 58, 11,208,131,154, 84,139,132,150, 13,123,124,134, 39, 53, 49,224,203,216, 39, 99,153,184,230,
- 74, 87, 22, 66,  7,237, 90, 37, 32,157,167,186,253,149,189,166,182,170,174,167,150, 79,138,228,206,127, 91,114, 84,118,101, 28,
-208, 95, 43,230,188, 93, 69,115, 24,229,230,158,101, 81,155, 90,130,146, 27, 74, 82, 18,149, 18,216,  0,157,183,181, 89,149,229,
-101, 58,191,  6, 82,134,153,234, 36,156, 83,232,229,203,202, 29,178, 56, 41,132,180, 86,196,134,143,137, 43,  4, 43, 78,197, 14,
-209, 71,248,239,195, 28, 83, 24,227,115, 79, 60, 48,104,233,156, 63,212, 37, 63,224,125, 39,207,105, 55, 91, 73, 27,129,236,184,
-185, 26, 26,229, 55, 13,167, 46, 43,131, 58,189,179,114,115,120, 97, 36,117, 92, 86, 83, 31,148,117, 17,202, 85, 30, 91,136,243,
- 16,203,160, 13,192,125,237,170,  4,131,110,222,218,227,239,216,157,164,223, 21,210,142,238,213,216, 92,241,151,163, 28,217,182,
-149,157,223, 50,206, 84, 57,249, 90, 20,116,166,247,236, 92,131,201,196,163,181, 58, 83, 29,246, 46, 81, 99, 22,129,250, 52,222,
-253,138,160, 41, 56,164,245,219,122, 71,124, 92,162,191, 44, 22,213,  3,234,164,239,133,202,130,252,177, 29,109, 75,223, 49,185,
- 70, 87,142,178,189,244,245,120, 76,164,117,194,219,112,117,181, 72,174,  9,148, 71,144,  5, 59, 48, 80, 34,221,141,  9,137, 64,
-246,209, 81, 65,180, 81, 80,  6,218, 42,  1,109, 52,181, 16, 34, 40,  0,173, 74,  1, 90,129,  2, 34,148,  4, 16, 41, 64, 73, 20,
-225,  2,181,  0, 29,168,  0,236, 41,  0,166, 75,122, 15,117, 94,108,175, 65, 65,170, 76,193, 65, 65,171,246, 82,102, 22,131,169,
-103,190,152,228, 57, 33,244, 55,236,168,220,135, 80,117, 40,  2,152,216,225, 97, 52,218,139, 65, 97, 52,149, 20, 59, 10, 64, 27,
-147, 38, 60, 40,238,204,152,234, 88,138,200,220,235,203, 54, 74, 71,252,186, 10,124, 33, 41,201, 70, 42,173,145,220,185, 24, 69,
-202, 78,137, 30,122,245, 51,159, 47,146,202,110, 12, 68,249, 88,120,107, 43,101, 42, 31,181,113,100,109, 46, 47,187, 79,186,158,
-206,218,244,189,151,106, 90,104,185, 75, 25,201, 99,208,186,151,188,243, 45,239,118,252,204,148, 35,132, 34,252,175,175,220,140,
-115, 79,188, 82,  4,116,168,169, 86, 26,116, 39,178,182,229, 21,204,197,140,219, 93,148, 60,218,242, 81,206,245, 52,230,206,219,
-110,181, 49,171,114,230,135,101,186,177,202,232, 40,229, 50, 41,116, 58,210, 28, 74,129,184, 54, 36,222,147,184,133, 40,232, 49,
-206,117,193, 50,  6, 78,108,185, 41,109, 50, 83,100, 32,146,143,  8, 26,171, 83,173,170,205,155,113,141,114,149,111,206, 79,138,
- 43,203,170,177, 29,254,202,178,145, 85,186,136, 13, 18, 65,237,238, 20,174, 64,160, 73, 68, 53, 27, 92, 88, 30,210, 59,234, 39,
-112,153, 90,  9,248,237, 35, 64,176,163,109,109,174,180,177,155, 99, 37,  4,136,187, 63, 84,222,165,169,  9, 41,248,161,152,145,
-228,164, 16, 92,184, 85,250, 18, 45,254, 90,134, 51,172,156,122, 11, 19,182,163,  8,201,115, 27, 18,  3,141,121, 46,139,143,209,
- 61,160,211,242, 81,213, 12,207, 85, 70, 45, 37, 69,  8,135, 24,120,222, 62, 50, 58,145,210,223, 79,109, 53,210,185,159, 34, 68,
-219, 89, 35,197,157,143,130, 98, 32,113,248,137,153, 45, 91, 93,112,  2,161,112,146,122, 92,107,175,109,112,251,166,162,122,137,
-101,143,  4,118, 58, 29, 60,108, 65, 87,139, 54, 25,110, 92,137,  9, 67, 44, 56,183, 10,  0, 74, 19,114,162, 18,158,130,253,109,
-173, 98, 88,208, 56,226,209,184,231, 26,113,169,151,124, 74,204, 57,226,185,108, 27, 88,245, 36,214,188,114,217, 69, 89, 55, 34,
- 60,126, 31,145,155, 56, 70, 97,149, 73,125,203,236,142,  9,190,212,246,251,133, 73, 61,194,220, 33, 86,232,186, 70, 70,204,228,
-232,138,236,158,127,137,113, 13,204,  8, 77,103, 57, 18, 52, 13,169, 68, 64,142,176,127, 72, 34,197,213, 11,126,176, 77, 90,177,
-165,212,234,241,204,237,219,250,223,254,159, 89,159,170,220, 44,233,112,162,185, 62,143,233, 94,243,  3,200, 57, 63, 33,230,121,
-  1, 55, 53, 37,114,223, 72,217, 29,132,  0,134, 25, 71, 98, 26,105,  0, 37,  3,216,145, 93, 38,151, 71, 99, 73, 12,182,214, 85,
-205,243,126, 54,114,122,141, 85,237, 84,235, 55, 87,209,209,228, 37,224,113,143, 33,229,135, 16,166,164,146,129,168, 40,113, 44,
-147,101,169, 55,237, 23, 72,191,101,234, 13, 85,228,214, 24,175,111, 35, 67, 67, 97,166,234,169, 44, 60,116,230,215,160,209, 98,
-155,136,135, 39, 49,146, 97,200,234,105, 30, 50,210, 30,116, 33, 74, 42,219,188,221, 91,146,164,128,173,229, 54, 61, 52,172,203,
-238, 77, 69,193,167, 87,205,165,224,250,171, 83, 79, 79, 52,165, 40,206, 45,120,170,252,252,106,186,233, 66,230, 55, 55,225,113,
-224, 77,227,220,142, 18,151, 45,162, 16,137,205, 36, 45, 69, 66,202,  5, 42,212,161, 73, 87, 93, 59, 61,182,170, 51,219,117,114,
-156,110,217,151,101,255,  0, 75,247,115, 77, 22,229,184,105, 59, 86,175, 42, 74, 56,102,165,126, 41,166, 85,203, 91,222,160,161,
-168, 24,198,138,208,133,  4,170, 66, 80, 26, 11, 45, 39, 82,  2,137,242,197,136, 82,207, 78,225,214,174, 90,138,208, 55, 41,188,
- 95, 46, 60,125,125, 68, 55, 90,215,219, 81,143,  5,198, 92, 43, 79, 82,233,126, 99, 63, 47,134,207,199,182,185, 49, 20,183, 26,
- 97, 96, 58,218, 85,185, 14,109, 34,225, 43, 72, 77,239,208,105, 99,223, 90, 48,220, 33, 55,150, 84, 77,250, 61,102,100,182,217,
- 66, 57,237,182,215, 71, 79,151, 15, 87,148,210,136,216,252,190, 53,  7, 15,229, 42, 76,133,135, 24,125, 68,  4,180,164,120,212,
-219,226,202, 81, 82,134,131,160, 58,247, 11,229,103,157,169,255,  0,146,180, 88, 53,211,208,227,225,235, 54, 90,141,248,127,134,
-142,184,215,161,241,106, 94, 31, 26,140,142, 77,158, 61,145,131, 55, 18,197,222,146,155,191,142,120,111, 40, 82,118,233,219,127,
- 22,235, 43,244,133, 93,179,101,234, 45,202, 55, 30, 17,225, 37,225,254,134,126,166,247,229,231, 23, 24,227, 53,140, 95,135,143,
- 30,101,118, 83, 60,214,113, 65,150,160,169,149,165, 59,109,112,171, 29,215,178, 72,182,157,131, 74,181,103, 74,236,246,156,170,
- 84,191,172,141,244,160,162,234,134,217, 10,197, 77,137, 54, 62,225,184,141,253,151,212,  3, 78,149, 46,194, 81, 99, 35,254,  9,
-198, 81,230,116,140,148,140,132,120,112,114,222,106,155,148,149,238, 97,212,139, 41, 59,  8, 32,131,218, 65,174, 90,204, 33, 41,
-202,221, 42,185,157,109,235,147,183,  8,206,180,103, 65,244,247,154, 43, 46,183, 48,153, 87,188,204,179,109,252, 75, 46, 43, 66,
-235, 36,144,160,127,164,131,246, 31,101,115, 91,182,221,220,165,118,218,236, 86,143,169,252,125,102,254,215,184,119,175,187,155,
-237, 82,190, 53,240, 58, 58, 54,232,107,151,103, 64, 74, 64, 21, 19,  1,192,144,108, 41,149, 20,112, 33, 37, 58,211,106, 56, 10,
-108, 90,227,165,  9,128,209, 64,  7,223, 79,168,131, 46,183,115,238,167,197,136, 68,117,  3, 90,158, 44, 66, 58,155, 22,169, 20,
-132, 25, 83, 64,154,122,144,148, 16, 90,167,102, 16, 73,108,210,212,  4,148,154, 90,128, 68, 82,128, 45, 64,148,  8,138, 80, 11,
-110,148, 84,  4, 17, 78, 16,108,138,112,130, 77, 40,130,105, 64, 59,208,  0,189,  0, 67, 74,  6,209,238,169,219, 35, 72, 88,110,
-155, 81,104, 44, 55, 77,168,180, 22,150,197, 53,177,104, 56, 19, 77,168,180, 20, 19, 73, 81, 69,237,166,212,  2,165,  2,163, 61,
-201, 49,124,114, 56,123, 34,239,237, 86, 46,204, 86,236, 94,115,220, 59,  7,244,142,149,119, 75,163,185,168,149, 32,176,230,249,
- 47, 14,130,158,171, 89,111, 79, 26,205,227,209,205,156, 79,150,243, 28,191, 39,148,150, 45,182, 34, 85,120,208,154, 39, 98, 73,
-208, 41, 71,170,149,237, 63, 69,171,189,208,109,214,180,209,175, 62,114,240,224,143, 63,220, 55, 27,186,169, 83,151, 40,175, 12,
- 73,252, 43,210,105,249,233, 63,152,102, 45, 23, 24,131,190, 68,167,116, 74, 64,215,233, 62,202,173,185,111,208,177, 28,150,251,
- 82,228,145, 46,223,177, 74,228,179,220,224,105, 57,  7, 46,225, 88,134,218,196,113, 12, 44,105, 63,  9,116,254, 99, 33,  1, 96,
-185,107, 41, 87,208,174,246,246, 36,123,107, 47, 73,183,234,239, 55,115, 81,114, 75, 55,244,174,143,103,175,196,106,222,214,216,
-177,216,179, 21, 38,185,242, 94, 46,146,163, 17, 31,155,115, 39, 28, 98, 19,139, 44,182,130,227,136,101,  8,101, 33,  9, 34,231,
-106, 18,158,151,173, 43,145,211,105,255,  0,166,175,202,202, 79, 85,170,188,187, 83,105,121,189, 68, 44,254, 19, 35,134, 74,  3,
-249,117,161, 74,  9, 81,218,173,246, 74,186, 31, 13,251,123, 42, 77, 53,248, 92,120, 91, 69,107,202,228, 21,123,198,102,162, 64,
-197,207,151,183, 63,149,113, 16,247, 89, 79, 36, 23,148, 14,186,132,246,138,212,149,219,144,143,248,160,171,230, 51, 28, 99, 63,
-249, 36,217, 87,152,135,132,132,251,177,224,173, 82,216,211,200,148, 71,150, 84, 10, 65,213, 39,165,137,181, 91,177,114,236,210,
-114,236,245, 20,175, 66,220,106,150, 61,100, 60, 70, 71, 29, 10, 28,212, 76,128, 36, 74, 81, 79,194,200, 43, 41, 40,183,222, 27,
-108, 65,191,217, 86,111,219,148,218,202,233,210, 84,177,117, 65, 58,162,185,217,206,188,118,164, 88,104, 18,145,236,237,169,227,
-105, 34, 25, 93,114, 27, 13, 92,248,181, 38,157,152,106,135, 72,110, 49,177, 59,136, 22,236,161, 74,162, 74, 20, 39, 40,  9, 24,
-116,165, 35,196,202,183, 14,251,116, 53, 93,118,110,248,203,109,102,177,226, 41, 20, 44,106,250, 51,  9, 16,101, 46, 52,150,222,
-  6,219, 79, 91,  3,111,172, 17, 81, 93,130,148, 90, 38,179,113,194, 73,155,134,102,200,248, 49,152,207,206,120, 99,236, 68, 72,
-202, 62, 39,151,253, 16,  0,210,176, 37,110, 57,251,187, 81, 89,185,190,131,163,141,201, 40,119,183,100,242,242, 93, 36,172, 39,
- 39,206,242, 28,131, 56, 14, 31,199,156,157,145,126,226, 60,104,193,111, 62,187, 11,147,177,  9, 61,148,233,109, 81, 93,171,147,
- 34, 91,203,225, 24,250, 73,179,243, 28,139,133,228,198, 47,149,226,222,198,100, 20,144,224,109,237,  9,  4,245, 26, 85, 95,201,
- 90,212, 69,187, 82,204,150,  5,191,213,103,  7, 75,145,203, 82, 55, 33,231,243, 27,199,169, 24,210,182,100,204, 65,109,217, 64,
-217, 94, 81,234,132,119, 95,244,189,154, 81,164,218,160,231, 89,226,163,203,175,165,251,  4,213,238,146,141,186, 67,  7, 46,126,
-227,158, 51, 17,233, 10, 74,213,254,149,123, 66,143,106,143,190,186,105, 92, 81,195,160,229,163,  7, 39, 94,147,107,134,196,  8,
-225,185, 78, 37, 40,195,199,242,140,217, 78,165,107,105, 10,113, 59,183, 56, 25,  5,106, 77,206,192,  6,128,245,235, 88,119,239,
-231,110, 63,214,235,149, 42, 85,211,146,174, 11,164,233,108,217,238,162,164,190, 85, 74,190, 88,243,116,197,174, 73, 23,252,177,
-156,123,108,124,102, 48,185,  6,116, 54,149, 33,164, 43,192,243, 96, 36,168, 21,182, 84,189,155,244, 27,122, 40, 30,149,151,160,
-148,220,178,206,146,140,157, 58,159,137,225, 90,116,242,102,166,185, 67, 35,156, 59, 46, 42,171,165,123,171,209,204,197, 65,229,
- 89,220,164,230, 35, 60,250, 16,167,128,101,111,182,211,104,120,182, 60, 91,  2,128,210,231,187,182,183,174,232,108,218,131,146,
- 92, 49,165, 93, 12, 13, 62,227,126,245,200,197,180,171,133, 82, 85,167, 69, 77,252, 79, 78,190, 36,180,195,202, 91, 18,166, 52,
- 23,  1, 62, 90,124,185,  4,128,167, 85,117, 93, 33, 13,131,226,222,119,147,217, 88, 23, 55, 76,177,115,141, 26,139,237,116,199,
-253,171,166,178,165, 85, 59, 41,115,169,186,180, 80,207,221,202,170, 77, 97,130,163,233,234,162,231, 86,228, 85,196,149, 23,131,
-188,246, 51, 34,191, 42, 46, 65, 46,180, 37, 70,  4,150,220,  1, 27,193, 78,167,105,184,210,199, 91,246, 29, 39,156, 37,173, 74,
-112,197,194,142,143,154,198,132, 74,228, 52, 85,183, 60, 35, 58,226,185, 60, 57,116, 18,185, 47, 36,149, 49,214, 50,171, 95,196,
-124, 60,114,210, 35,194,105,228, 33,196,110,220, 55,182,179,181,  2,250,232,155,251,234, 29, 30,142, 48, 78,218,194,174,181,147,
- 88,120,154,226, 77,169,189, 37, 75,141,185, 81, 96,162,165,143,142,188, 12, 30, 23, 31, 29,113, 63, 51,144,224,105, 42,124,178,
-227,235,243,  3, 76,130,  1,  4,249,122,221, 68,216, 95, 74,232,245, 55,100,165,146, 42,184, 86,152, 85,249,206,119, 71, 98, 61,
-223,123, 44, 59, 84,174, 52,143,155,164,146,220, 24,200,203,190, 96,186,204,137, 17,151,185,141,142,111, 75,237, 40,104,117, 39,
-197,216, 69,244,251,106, 23,118, 78,210,204,154, 79,142, 28, 25, 52, 45,195,190,110, 13, 55, 30, 24,215, 50,247,242, 39, 50,222,
- 49,244,166, 84, 23, 27, 89, 66, 85,116,232,135,146,  5,130,110, 47,226,235,216, 45,167,213,  4,157,200,246,100,159,176,179,109,
- 91,155,205, 10, 58,127,229,229,233, 27, 49,211, 46, 76, 84,  5,111, 14, 62,144,148,141,  8, 43, 88,  6,157,157,194, 50,125,  8,
- 73,193, 73,175, 25,211,125, 67, 97,196, 53,133,195, 64, 69,158,242, 75,238,  0, 47,162,149,100,223,217,161,174, 79,104,146,110,
-229,201,240,173, 13,189,198,180,140, 35,199,137,202,224,114,169, 80,121,116, 60,204, 69, 18,168,111, 33, 13,165, 63,166,210, 78,
-213, 15,237,130,126,186,235,238,232, 99, 61, 44,173,203,250,151,167,224,115, 54,119,  9,195, 87, 27,139,250, 93, 60,156,252,231,
-175,161, 76, 76,134,144,234, 15,133, 96, 16, 43,197, 46, 91,202,232,123, 84,101, 85, 82,209,151, 65,170,146,136,226, 82, 78,128,
-222,161, 98,161,192,123,197, 52, 81, 55,236, 29, 59, 41, 69, 18,173, 77,205, 42, 17,141, 44,219,252,148,244, 52,138,161,186,247,
-169,144, 13, 41, 29,191,101, 61, 48, 26, 45,158,218,117, 68, 18, 81,125, 77, 58,160, 36,163,234,165,168,  8, 40,191, 94,148,181,
- 16, 65,109, 52,234,128,146,139,123,169,106, 32,141,162,157, 80, 11,109, 21,  1, 37, 52,234,136, 54,164,211,147, 16, 65, 77, 58,
-162, 13,144,105,106, 32, 45, 74,  1, 80,  3,104, 70,131,221, 79,108,104,224, 77, 50,162,208, 80, 77, 37, 69, 22, 19, 73, 81, 69,
-  4,211,106, 40,176,154, 74,128,101, 52,149, 20,139, 42, 67, 17, 24,114, 84,167,  3, 81,153, 73, 91,174, 43,162, 82, 63,229,160,
-169, 97,  9, 77,168,197, 85,178, 43,147,140, 34,229, 39, 68,143, 53,114, 92,211,217,108,244,231, 80,167, 28, 47,200, 89,103,127,
-223,242,201,240, 36,247, 88, 88,127, 37,122,174,143, 76,173, 89,138,193, 81, 99,227,230,121, 86,179, 87, 43,183,229, 74,226,240,
-241,114, 58,199,165,158,151,170, 75,106,207,230,255,  0,213,241,145,172,169,114,156, 27,130, 47,168, 74, 71,106,149,216, 43,142,
-223, 55,172,175,186,183,140,159,  4,117, 27, 86,218,160,148,230,177, 26,245,159,152, 77,242,177,248, 44,114, 62,  7,  2,242, 28,
- 33,180,104, 84,150,148,  6,197, 17,214,247,220,174,253,  7, 74,119,237,205,190, 21,149,217,246,174, 42,122,121,251,135,239,186,
-169,219,140,109,199,  8,202,181,235,167, 35, 53,197, 49,188, 81,136,137,205,230,231,165,213, 52,164,249,184,182,197,221, 40, 88,
-208,133,125,209,111,210,185,210,182,245,151, 47,201,228,130,167, 89,141, 98, 16, 73, 73,244,121,136, 28,155,212,148, 23, 20,140,
- 26, 12,100,106, 55,133, 89, 90,141,166,196, 88,128, 71,101, 77,163,218, 90,198,101,125, 78,231, 24,170, 71, 19,158,200,206, 78,
-150,178,183, 22, 85,221,126,150,174,138, 26,104, 65, 96,115,247, 53,151, 46, 60, 70, 12,217, 43, 22,  0,222,164,238,226,138,253,
-236,216,166,225,100,231, 40, 37,166,150,234,143, 64,144, 73,251, 41,174,229,184, 44, 93,  7,198,205,219,143,  4,216, 83,176,121,
- 28,112, 73,150,130,210,150, 74, 82,133, 16, 21,107, 94,246,235, 75,107, 85,110,231,203,136,151,180, 87, 45, 46,214,  4, 84,180,
-227, 73,190,203,158,219,255,  0, 53, 76,228,153, 12, 98,227,141,  9, 12,187, 13,  9,220,176,177, 35,245, 77,138,116,212, 16,110,
- 62,171, 84, 82,140,219,229, 66,120, 92,130, 88,167, 82, 36,137, 10,112,216,159,  8, 38,201,236,214,166,132, 18, 42,220,157, 73,
-120,169, 41,  9,114, 58,254,234,135,216,106, 27,240,224,209, 54,158,231, 24,178,  4,148,108,113, 73,238, 58,123,170,196, 29, 81,
- 86,106,140,149,140,136,220,169, 12, 48,224,254,245,105, 23,246, 19, 81, 95,184,227, 22,215, 34,125, 61,181, 57, 36,249,178,219,
-157,228,151, 47, 48,152, 32,  4, 68,198,180,136,204,180,157, 18, 13,130,148,160, 59,201, 53, 75,107,178,161,107, 55, 57,186,178,
-230,233,117,202,238, 94, 80, 84, 59,231,164,178,189, 26,226,254,150,171,155, 99, 57, 76,140, 39,173,120,207, 57,104, 72, 86,206,
-183,  9, 66, 18, 65, 11, 74,211,162,181,170,187,149,219,213, 80,140, 28,148,154,229,203,166,188,168, 87,210,218,132,170,228,210,
- 72,225, 30,160,250,139,201,125, 75,205, 12,231, 39,125, 47, 76, 66,  3, 72,242,211,177, 33, 35,217,237,173, 29, 22,130,214,150,
- 45, 67,250,157, 89, 13,253, 68,174,181, 94, 69,108,118,255,  0, 48, 67,123,175,240,209, 26,185, 39,174,134,234,176,237, 36,157,
-163,232,165,155,238,219,233,147, 39,183, 30,246,137,240,138, 58, 44, 30, 23, 53, 56,148, 77,145, 42, 52,  7, 86,217,151, 11, 26,
-180, 33, 69, 72, 79,233, 21, 47,196, 79,135, 91, 17, 92,212,247,  8, 59,185, 82,148,149,114,202, 93,126, 36,116, 81,210,228,183,
- 86,227, 23, 76,202, 20, 92, 60,111, 31, 81,