This commit will switch blender to use tangent space generated within
authorM.G. Kishalmi <lmg@kishalmi.net>
Mon, 14 Feb 2011 18:18:46 +0000 (18:18 +0000)
committerM.G. Kishalmi <lmg@kishalmi.net>
Mon, 14 Feb 2011 18:18:46 +0000 (18:18 +0000)
the two files mikktspace.h and mikktspace.c. These are standalone files
which can be redistributed into any other application and regenerate the
same tangent spaces. The implementation is independent of the ordering
of faces and the vertex ordering of faces.

20 files changed:
source/blender/blenkernel/BKE_DerivedMesh.h
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/mikktspace.c [new file with mode: 0644]
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/blenkernel/mikktspace.h [new file with mode: 0644]
source/blender/gpu/intern/gpu_codegen.c
source/blender/gpu/intern/gpu_material.c
source/blender/gpu/intern/gpu_shader_material.glsl
source/blender/gpu/intern/gpu_shader_material.glsl.c
source/blender/gpu/intern/gpu_shader_vertex.glsl
source/blender/gpu/intern/gpu_shader_vertex.glsl.c
source/blender/render/extern/include/RE_shader_ext.h
source/blender/render/intern/source/convertblender.c
source/blender/render/intern/source/render_texture.c
source/blender/render/intern/source/rendercore.c
source/blender/render/intern/source/renderdatabase.c
source/blender/render/intern/source/shadeinput.c

index 79e9b11..1f56c16 100644 (file)
@@ -533,7 +533,7 @@ typedef struct DMVertexAttribs {
        } mcol[MAX_MCOL];
 
        struct {
-               float (*array)[3];
+               float (*array)[4];
                int emOffset, glIndex;
        } tang;
 
index 5f5b413..ae72423 100644 (file)
@@ -106,6 +106,7 @@ set(SRC
        intern/mball.c
        intern/mesh.c
        intern/mesh_validate.c
+       intern/mikktspace.c
        intern/modifier.c
        intern/multires.c
        intern/nla.c
@@ -222,6 +223,7 @@ set(SRC
        BKE_writeffmpeg.h
        BKE_writeframeserver.h
        depsgraph_private.h
+       mikktspace.h
        intern/CCGSubSurf.h
        intern/bmesh_private.h
        nla_private.h
index eedc263..79e23b7 100644 (file)
@@ -948,7 +948,7 @@ static void emDM_drawMappedFacesGLSL(DerivedMesh *dm,
        }                                                                                                                                                       \
        if(attribs.tottang) {                                                                                                           \
                float *tang = attribs.tang.array[i*4 + vert];                                                   \
-               glVertexAttrib3fvARB(attribs.tang.glIndex, tang);                                               \
+               glVertexAttrib4fvARB(attribs.tang.glIndex, tang);                                               \
        }                                                                                                                                                       \
 }
 
@@ -2481,6 +2481,111 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob)
 
 /* ******************* GLSL ******************** */
 
+typedef struct
+{
+       float * precomputedFaceNormals;
+       MTFace * mtface;        // texture coordinates
+       MFace * mface;          // indices
+       MVert * mvert;          // vertices & normals
+       float (*orco)[3];
+       float (*tangent)[4];    // destination
+       int numFaces;
+
+} SGLSLMeshToTangent;
+
+// interface
+#include "mikktspace.h"
+
+static int GetNumFaces(const SMikkTSpaceContext * pContext)
+{
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+       return pMesh->numFaces;
+}
+
+static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num)
+{
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+       return pMesh->mface[face_num].v4!=0 ? 4 : 3;
+}
+
+static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+       unsigned int indices[] = {      pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+                                                               pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
+       VECCOPY(fPos, pMesh->mvert[indices[vert_index]].co);
+}
+
+static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+
+       if(pMesh->mtface!=NULL)
+       {
+               float * uv = pMesh->mtface[face_num].uv[vert_index];
+               fUV[0]=uv[0]; fUV[1]=uv[1];
+       }
+       else
+       {
+               unsigned int indices[] = {      pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+                                                                       pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
+
+               map_to_sphere( &fUV[0], &fUV[1],pMesh->orco[indices[vert_index]][0], pMesh->orco[indices[vert_index]][1], pMesh->orco[indices[vert_index]][2]);
+       }
+}
+
+static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+       unsigned int indices[] = {      pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+                                                               pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
+
+       const int smoothnormal = (pMesh->mface[face_num].flag & ME_SMOOTH);
+       if(!smoothnormal)       // flat
+       {
+               if(pMesh->precomputedFaceNormals)
+               {
+                       VECCOPY(fNorm, &pMesh->precomputedFaceNormals[3*face_num]);
+               }
+               else
+               {
+                       float nor[3];
+                       float * p0, * p1, * p2;
+                       const int iGetNrVerts = pMesh->mface[face_num].v4!=0 ? 4 : 3;
+                       p0 = pMesh->mvert[indices[0]].co; p1 = pMesh->mvert[indices[1]].co; p2 = pMesh->mvert[indices[2]].co;
+                       if(iGetNrVerts==4)
+                       {
+                               float * p3 = pMesh->mvert[indices[3]].co;
+                               normal_quad_v3( nor, p0, p1, p2, p3);
+                       }
+                       else {
+                               normal_tri_v3(nor, p0, p1, p2);
+                       }
+                       VECCOPY(fNorm, nor);
+               }
+       }
+       else
+       {
+               int i=0;
+               short * no = pMesh->mvert[indices[vert_index]].no;
+               for(i=0; i<3; i++)
+                       fNorm[i]=no[i]/32767.0f;
+               normalize_v3(fNorm);
+       }
+}
+static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+       float * pRes = pMesh->tangent[4*face_num+iVert];
+       VECCOPY(pRes, fvTangent);
+       pRes[3]=fSign;
+}
+
+
 void DM_add_tangent_layer(DerivedMesh *dm)
 {
        /* mesh vars */
@@ -2489,14 +2594,17 @@ void DM_add_tangent_layer(DerivedMesh *dm)
        MVert *mvert, *v1, *v2, *v3, *v4;
        MemArena *arena= NULL;
        VertexTangent **vtangents= NULL;
-       float (*orco)[3]= NULL, (*tangent)[3];
+       float (*orco)[3]= NULL, (*tangent)[4];
        float *uv1, *uv2, *uv3, *uv4, *vtang;
        float fno[3], tang[3], uv[4][2];
-       int i, j, len, mf_vi[4], totvert, totface;
+       int i, j, len, mf_vi[4], totvert, totface, iCalcNewMethod;
+       float *nors;
 
        if(CustomData_get_layer_index(&dm->faceData, CD_TANGENT) != -1)
                return;
 
+       nors = dm->getFaceDataArray(dm, CD_NORMAL);
+
        /* check we have all the needed layers */
        totvert= dm->getNumVerts(dm);
        totface= dm->getNumFaces(dm);
@@ -2519,72 +2627,108 @@ void DM_add_tangent_layer(DerivedMesh *dm)
        arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "tangent layer arena");
        BLI_memarena_use_calloc(arena);
        vtangents= MEM_callocN(sizeof(VertexTangent*)*totvert, "VertexTangent");
-       
-       /* sum tangents at connected vertices */
-       for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) {
-               v1= &mvert[mf->v1];
-               v2= &mvert[mf->v2];
-               v3= &mvert[mf->v3];
-
-               if (mf->v4) {
-                       v4= &mvert[mf->v4];
-                       normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co);
-               }
-               else {
-                       v4= NULL;
-                       normal_tri_v3( fno,v3->co, v2->co, v1->co);
-               }
-               
-               if(mtface) {
-                       uv1= tf->uv[0];
-                       uv2= tf->uv[1];
-                       uv3= tf->uv[2];
-                       uv4= tf->uv[3];
-               }
-               else {
-                       uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
-                       map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
-                       map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
-                       map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
-                       if(v4)
-                               map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
-               }
+
+       // new computation method
+       iCalcNewMethod = 1;
+       if(iCalcNewMethod!=0)
+       {
+               SGLSLMeshToTangent mesh2tangent;
+               SMikkTSpaceContext sContext;
+               SMikkTSpaceInterface sInterface;
+               memset(&mesh2tangent, 0, sizeof(SGLSLMeshToTangent));
+               memset(&sContext, 0, sizeof(SMikkTSpaceContext));
+               memset(&sInterface, 0, sizeof(SMikkTSpaceInterface));
+
+               mesh2tangent.precomputedFaceNormals = nors;
+               mesh2tangent.mtface = mtface;
+               mesh2tangent.mface = mface;
+               mesh2tangent.mvert = mvert;
+               mesh2tangent.orco = orco;
+               mesh2tangent.tangent = tangent;
+               mesh2tangent.numFaces = totface;
+
+               sContext.m_pUserData = &mesh2tangent;
+               sContext.m_pInterface = &sInterface;
+               sInterface.m_getNumFaces = GetNumFaces;
+               sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace;
+               sInterface.m_getPosition = GetPosition;
+               sInterface.m_getTexCoord = GetTextureCoordinate;
+               sInterface.m_getNormal = GetNormal;
+               sInterface.m_setTSpaceBasic = SetTSpace;
+
+               // 0 if failed
+               iCalcNewMethod = genTangSpaceDefault(&sContext);
+       }
+
+       if(!iCalcNewMethod)
+       {
+               /* sum tangents at connected vertices */
+               for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) {
+                       v1= &mvert[mf->v1];
+                       v2= &mvert[mf->v2];
+                       v3= &mvert[mf->v3];
+
+                       if (mf->v4) {
+                               v4= &mvert[mf->v4];
+                               normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co);
+                       }
+                       else {
+                               v4= NULL;
+                               normal_tri_v3( fno,v3->co, v2->co, v1->co);
+                       }
                
-               tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang);
-               sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
-               sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2);
-               sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
+                       if(mtface) {
+                               uv1= tf->uv[0];
+                               uv2= tf->uv[1];
+                               uv3= tf->uv[2];
+                               uv4= tf->uv[3];
+                       }
+                       else {
+                               uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
+                               map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
+                               map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
+                               map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
+                               if(v4)
+                                       map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
+                       }
                
-               if(mf->v4) {
-                       v4= &mvert[mf->v4];
-                       
-                       tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang);
+                       tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang);
                        sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
+                       sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2);
                        sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
-                       sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4);
+               
+                       if(mf->v4) {
+                               v4= &mvert[mf->v4];
+                       
+                               tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang);
+                               sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
+                               sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
+                               sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4);
+                       }
                }
-       }
        
-       /* write tangent to layer */
-       for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) {
-               len= (mf->v4)? 4 : 3; 
-
-               if(mtface == NULL) {
-                       map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
-                       map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
-                       map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
-                       if(len==4)
-                               map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
-               }
+               /* write tangent to layer */
+               for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) {
+                       len= (mf->v4)? 4 : 3; 
+
+                       if(mtface == NULL) {
+                               map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
+                               map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
+                               map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
+                               if(len==4)
+                                       map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
+                       }
                
-               mf_vi[0]= mf->v1;
-               mf_vi[1]= mf->v2;
-               mf_vi[2]= mf->v3;
-               mf_vi[3]= mf->v4;
+                       mf_vi[0]= mf->v1;
+                       mf_vi[1]= mf->v2;
+                       mf_vi[2]= mf->v3;
+                       mf_vi[3]= mf->v4;
                
-               for(j=0; j<len; j++) {
-                       vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]);
-                       normalize_v3_v3(tangent[j], vtang);
+                       for(j=0; j<len; j++) {
+                               vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]);
+                               normalize_v3_v3(tangent[j], vtang);
+                               ((float *) tangent[j])[3]=1.0f;
+                       }
                }
        }
        
index abf2257..9a04c75 100644 (file)
@@ -1066,7 +1066,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                }                                                                                                                                                       \
                if(attribs.tottang) {                                                                                                           \
                        float *tang = attribs.tang.array[a*4 + vert];                                                   \
-                       glVertexAttrib3fvARB(attribs.tang.glIndex, tang);                                               \
+                       glVertexAttrib4fvARB(attribs.tang.glIndex, tang);                                               \
                }                                                                                                                                                       \
                if(smoothnormal)                                                                                                                        \
                        glNormal3sv(mvert[index].no);                                                                                   \
@@ -1158,7 +1158,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                                                }       
                                                if(attribs.tottang) {
                                                        datatypes[numdata].index = attribs.tang.glIndex;
-                                                       datatypes[numdata].size = 3;
+                                                       datatypes[numdata].size = 4;
                                                        datatypes[numdata].type = GL_FLOAT;
                                                        numdata++;
                                                }
@@ -1248,12 +1248,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                                        }       
                                        if(attribs.tottang) {
                                                float *tang = attribs.tang.array[a*4 + 0];
-                                               VECCOPY((float *)&varray[elementsize*curface*3+offset], tang);
+                                               QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang);
                                                tang = attribs.tang.array[a*4 + 1];
-                                               VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
+                                               QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
                                                tang = attribs.tang.array[a*4 + 2];
-                                               VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
-                                               offset += sizeof(float)*3;
+                                               QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
+                                               offset += sizeof(float)*4;
                                        }
                                }
                                curface++;
@@ -1288,12 +1288,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                                                }       
                                                if(attribs.tottang) {
                                                        float *tang = attribs.tang.array[a*4 + 2];
-                                                       VECCOPY((float *)&varray[elementsize*curface*3+offset], tang);
+                                                       QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang);
                                                        tang = attribs.tang.array[a*4 + 3];
-                                                       VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
+                                                       QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
                                                        tang = attribs.tang.array[a*4 + 0];
-                                                       VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
-                                                       offset += sizeof(float)*3;
+                                                       QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
+                                                       offset += sizeof(float)*4;
                                                }
                                        }
                                        curface++;
index 7788f9f..87fe545 100644 (file)
@@ -829,7 +829,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
        {sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
        {sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL},
        {sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol},
-       {sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+       {sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
        {sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
         layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps,
         layerFilesize_mdisps, layerValidate_mdisps},
diff --git a/source/blender/blenkernel/intern/mikktspace.c b/source/blender/blenkernel/intern/mikktspace.c
new file mode 100644 (file)
index 0000000..83623a1
--- /dev/null
@@ -0,0 +1,1886 @@
+/**
+ *  Copyright (C) 2011 by Morten S. Mikkelsen
+ *
+ *  This software is provided 'as-is', without any express or implied
+ *  warranty.  In no event will the authors be held liable for any damages
+ *  arising from the use of this software.
+ *
+ *  Permission is granted to anyone to use this software for any purpose,
+ *  including commercial applications, and to alter it and redistribute it
+ *  freely, subject to the following restrictions:
+ *
+ *  1. The origin of this software must not be misrepresented; you must not
+ *     claim that you wrote the original software. If you use this software
+ *     in a product, an acknowledgment in the product documentation would be
+ *     appreciated but is not required.
+ *  2. Altered source versions must be plainly marked as such, and must not be
+ *     misrepresented as being the original software.
+ *  3. This notice may not be removed or altered from any source distribution.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <float.h>
+#include <malloc.h>
+#include "mikktspace.h"
+
+#define TFALSE         0
+#define TTRUE          1
+
+#ifndef M_PI
+#define M_PI   3.1415926535897932384626433832795
+#endif
+
+#define INTERNAL_RND_SORT_SEED         39871946
+
+// internal structure
+typedef struct
+{
+       float x, y, z;
+} SVec3;
+
+tbool                  veq( const SVec3 v1, const SVec3 v2 )
+{
+       return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z);
+}
+
+const SVec3            vadd( const SVec3 v1, const SVec3 v2 )
+{
+       SVec3 vRes;
+
+       vRes.x = v1.x + v2.x;
+       vRes.y = v1.y + v2.y;
+       vRes.z = v1.z + v2.z;
+
+       return vRes;
+}
+
+
+const SVec3            vsub( const SVec3 v1, const SVec3 v2 )
+{
+       SVec3 vRes;
+
+       vRes.x = v1.x - v2.x;
+       vRes.y = v1.y - v2.y;
+       vRes.z = v1.z - v2.z;
+
+       return vRes;
+}
+
+const SVec3            vscale(const float fS, const SVec3 v)
+{
+       SVec3 vRes;
+
+       vRes.x = fS * v.x;
+       vRes.y = fS * v.y;
+       vRes.z = fS * v.z;
+
+       return vRes;
+}
+
+float                  LengthSquared( const SVec3 v )
+{
+       return v.x*v.x + v.y*v.y + v.z*v.z;
+}
+
+float                  Length( const SVec3 v )
+{
+       return sqrtf(LengthSquared(v));
+}
+
+const SVec3            Normalize( const SVec3 v )
+{
+       return vscale(1 / Length(v), v);
+}
+
+const float            vdot( const SVec3 v1, const SVec3 v2)
+{
+       return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
+}
+
+
+tbool NotZero(const float fX)
+{
+       // could possibly use FLT_EPSILON instead
+       return fabsf(fX) > FLT_MIN;
+}
+
+tbool VNotZero(const SVec3 v)
+{
+       // might change this to an epsilon based test
+       return NotZero(v.x) || NotZero(v.y) || NotZero(v.z);
+}
+
+
+
+typedef struct
+{
+       int iNrFaces;
+       int * pTriMembers;
+} SSubGroup;
+
+typedef struct
+{
+       int iNrFaces;
+       int * pFaceIndices;
+       int iVertexRepresentitive;
+       tbool bOrientPreservering;
+} SGroup;
+
+// 
+#define MARK_DEGENERATE                                1
+#define QUAD_ONE_DEGEN_TRI                     2
+#define GROUP_WITH_ANY                         4
+#define ORIENT_PRESERVING                      8
+
+
+
+typedef struct
+{
+       int FaceNeighbors[3];
+       SGroup * AssignedGroup[3];
+       
+       // normalized first order face derivatives
+       SVec3 vOs, vOt;
+       float fMagS, fMagT;     // original magnitudes
+
+       // determines if the current and the next triangle are a quad.
+       int iOrgFaceNumber;
+       int iFlag, iTSpacesOffs;
+       unsigned char vert_num[4];
+} STriInfo;
+
+typedef struct
+{
+       SVec3 vOs;
+       float fMagS;
+       SVec3 vOt;
+       float fMagT;
+       int iCounter;   // this is to average back into quads.
+       tbool bOrient;
+} STSpace;
+
+int GenerateInitialVerticesIndexList(STriInfo pTriInfos[], int piTriList_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn);
+void GenerateSharedVerticesIndexList(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn);
+void InitTriInfo(STriInfo pTriInfos[], const int piTriListIn[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn);
+int Build4RuleGroups(STriInfo pTriInfos[], SGroup pGroups[], int piGroupTrianglesBuffer[], const int piTriListIn[], const int iNrTrianglesIn);
+tbool GenerateTSpaces(STSpace psTspace[], const STriInfo pTriInfos[], const SGroup pGroups[],
+                                        const int iNrActiveGroups, const int piTriListIn[], const float fThresCos,
+                                        const SMikkTSpaceContext * pContext);
+
+int MakeIndex(const int iFace, const int iVert)
+{
+       assert(iVert>=0 && iVert<4 && iFace>=0);
+       return (iFace<<2) | (iVert&0x3);
+}
+
+void IndexToData(int * piFace, int * piVert, const int iIndexIn)
+{
+       piVert[0] = iIndexIn&0x3;
+       piFace[0] = iIndexIn>>2;
+}
+
+const STSpace AvgTSpace(const STSpace * pTS0, const STSpace * pTS1)
+{
+       STSpace ts_res;
+
+       // this if is important. Due to floating point precision
+       // averaging when ts0==ts1 will cause a slight difference
+       // which results in tangent space splits later on
+       if(pTS0->fMagS==pTS1->fMagS && pTS0->fMagT==pTS1->fMagT &&
+          veq(pTS0->vOs,pTS1->vOs)     && veq(pTS0->vOt, pTS1->vOt))
+       {
+               ts_res.fMagS = pTS0->fMagS;
+               ts_res.fMagT = pTS0->fMagT;
+               ts_res.vOs = pTS0->vOs;
+               ts_res.vOt = pTS0->vOt;
+       }
+       else
+       {
+               ts_res.fMagS = 0.5f*(pTS0->fMagS+pTS1->fMagS);
+               ts_res.fMagT = 0.5f*(pTS0->fMagT+pTS1->fMagT);
+               ts_res.vOs = vadd(pTS0->vOs,pTS1->vOs);
+               ts_res.vOt = vadd(pTS0->vOt,pTS1->vOt);
+               if( VNotZero(ts_res.vOs) ) ts_res.vOs = Normalize(ts_res.vOs);
+               if( VNotZero(ts_res.vOt) ) ts_res.vOt = Normalize(ts_res.vOt);
+       }
+
+       return ts_res;
+}
+
+
+
+const SVec3 GetPosition(const SMikkTSpaceContext * pContext, const int index);
+const SVec3 GetNormal(const SMikkTSpaceContext * pContext, const int index);
+const SVec3 GetTexCoord(const SMikkTSpaceContext * pContext, const int index);
+
+
+// degen triangles
+void DegenPrologue(STriInfo pTriInfos[], int piTriList_out[], const int iNrTrianglesIn, const int iTotTris);
+void DegenEpilogue(STSpace psTspace[], STriInfo pTriInfos[], int piTriListIn[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn, const int iTotTris);
+
+
+tbool genTangSpaceDefault(const SMikkTSpaceContext * pContext)
+{
+       return genTangSpace(pContext, 180.0f);
+}
+
+tbool genTangSpace(const SMikkTSpaceContext * pContext, const float fAngularThreshold)
+{
+       // count nr_triangles
+       int * piTriListIn = NULL, * piGroupTrianglesBuffer = NULL;
+       STriInfo * pTriInfos = NULL;
+       SGroup * pGroups = NULL;
+       STSpace * psTspace = NULL;
+       int iNrTrianglesIn = 0, f=0, t=0, i=0;
+       int iNrTSPaces = 0, iTotTris = 0, iDegenTriangles = 0, iNrMaxGroups = 0;
+       int iNrActiveGroups = 0, index = 0;
+       const int iNrFaces = pContext->m_pInterface->m_getNumFaces(pContext);
+       tbool bRes = TFALSE;
+       const float fThresCos = (const float) cos((fAngularThreshold*M_PI)/180);
+
+       // verify all call-backs have been set
+       if( pContext->m_pInterface->m_getNumFaces==NULL ||
+               pContext->m_pInterface->m_getNumVerticesOfFace==NULL ||
+               pContext->m_pInterface->m_getPosition==NULL ||
+               pContext->m_pInterface->m_getNormal==NULL ||
+               pContext->m_pInterface->m_getTexCoord==NULL )
+               return TFALSE;
+
+       // count triangles on supported faces
+       for(f=0; f<iNrFaces; f++)
+       {
+               const int verts = pContext->m_pInterface->m_getNumVerticesOfFace(pContext, f);
+               if(verts==3) ++iNrTrianglesIn;
+               else if(verts==4) iNrTrianglesIn += 2;
+       }
+       if(iNrTrianglesIn<=0) return TFALSE;
+
+       // allocate memory for an index list
+       piTriListIn = (int *) malloc(sizeof(int)*3*iNrTrianglesIn);
+       pTriInfos = (STriInfo *) malloc(sizeof(STriInfo)*iNrTrianglesIn);
+       if(piTriListIn==NULL || pTriInfos==NULL)
+       {
+               if(piTriListIn!=NULL) free(piTriListIn);
+               if(pTriInfos!=NULL) free(pTriInfos);
+               return TFALSE;
+       }
+
+       // make an initial triangle --> face index list
+       iNrTSPaces = GenerateInitialVerticesIndexList(pTriInfos, piTriListIn, pContext, iNrTrianglesIn);
+
+       // make a welded index list of identical positions and attributes (pos, norm, texc)
+       //printf("gen welded index list begin\n");
+       GenerateSharedVerticesIndexList(piTriListIn, pContext, iNrTrianglesIn);
+       //printf("gen welded index list end\n");
+
+       // Mark all degenerate triangles
+       iTotTris = iNrTrianglesIn;
+       iNrTrianglesIn = 0;
+       iDegenTriangles = 0;
+       for(t=0; t<iTotTris; t++)
+       {
+               const int i0 = piTriListIn[t*3+0];
+               const int i1 = piTriListIn[t*3+1];
+               const int i2 = piTriListIn[t*3+2];
+               const SVec3 p0 = GetPosition(pContext, i0);
+               const SVec3 p1 = GetPosition(pContext, i1);
+               const SVec3 p2 = GetPosition(pContext, i2);
+               if(veq(p0,p1) || veq(p0,p2) || veq(p1,p2))      // degenerate
+               {
+                       pTriInfos[t].iFlag |= MARK_DEGENERATE;
+                       ++iDegenTriangles;
+               }
+       }
+       iNrTrianglesIn = iTotTris - iDegenTriangles;
+
+       // mark all triangle pairs that belong to a quad with only one
+       // good triangle. These need special treatment in DegenEpilogue().
+       // Additionally, move all good triangles to the start of
+       // pTriInfos[] and piTriListIn[] without changing order and
+       // put the degenerate triangles last.
+       DegenPrologue(pTriInfos, piTriListIn, iNrTrianglesIn, iTotTris);
+
+       
+       // evaluate triangle level attributes and neighbor list
+       //printf("gen neighbors list begin\n");
+       InitTriInfo(pTriInfos, piTriListIn, pContext, iNrTrianglesIn);
+       //printf("gen neighbors list end\n");
+
+       
+       // based on the 4 rules, identify groups based on connectivity
+       iNrMaxGroups = iNrTrianglesIn*3;
+       pGroups = (SGroup *) malloc(sizeof(SGroup)*iNrMaxGroups);
+       piGroupTrianglesBuffer = (int *) malloc(sizeof(int)*iNrTrianglesIn*3);
+       if(pGroups==NULL || piGroupTrianglesBuffer==NULL)
+       {
+               if(pGroups!=NULL) free(pGroups);
+               if(piGroupTrianglesBuffer!=NULL) free(piGroupTrianglesBuffer);
+               free(piTriListIn);
+               free(pTriInfos);
+               return TFALSE;
+       }
+       //printf("gen 4rule groups begin\n");
+       iNrActiveGroups =
+               Build4RuleGroups(pTriInfos, pGroups, piGroupTrianglesBuffer, piTriListIn, iNrTrianglesIn);
+       //printf("gen 4rule groups end\n");
+
+       //
+
+       psTspace = (STSpace *) malloc(sizeof(STSpace)*iNrTSPaces);
+       if(psTspace==NULL)
+       {
+               free(piTriListIn);
+               free(pTriInfos);
+               free(pGroups);
+               free(piGroupTrianglesBuffer);
+               return TFALSE;
+       }
+       memset(psTspace, 0, sizeof(STSpace)*iNrTSPaces);
+       for(t=0; t<iNrTSPaces; t++)
+       {
+               psTspace[t].vOs.x=1.0f; psTspace[t].vOs.y=0.0f; psTspace[t].vOs.z=0.0f; psTspace[t].fMagS = 1.0f;
+               psTspace[t].vOt.x=0.0f; psTspace[t].vOt.y=1.0f; psTspace[t].vOt.z=0.0f; psTspace[t].fMagT = 1.0f;
+       }
+
+       // make tspaces, each group is split up into subgroups if necessary
+       // based on fAngularThreshold. Finally a tangent space is made for
+       // every resulting subgroup
+       //printf("gen tspaces begin\n");
+       bRes = GenerateTSpaces(psTspace, pTriInfos, pGroups, iNrActiveGroups, piTriListIn, fThresCos, pContext);
+       //printf("gen tspaces end\n");
+       
+       // clean up
+       free(pGroups);
+       free(piGroupTrianglesBuffer);
+
+       if(!bRes)       // if an allocation in GenerateTSpaces() failed
+       {
+               // clean up and return false
+               free(pTriInfos); free(piTriListIn); free(psTspace);
+               return TFALSE;
+       }
+
+
+       // degenerate quads with one good triangle will be fixed by copying a space from
+       // the good triangle to the coinciding vertex.
+       // all other degenerate triangles will just copy a space from any good triangle
+       // with the same welded index in piTriListIn[].
+       DegenEpilogue(psTspace, pTriInfos, piTriListIn, pContext, iNrTrianglesIn, iTotTris);
+
+       free(pTriInfos); free(piTriListIn);
+
+       index = 0;
+       for(f=0; f<iNrFaces; f++)
+       {
+               const int verts = pContext->m_pInterface->m_getNumVerticesOfFace(pContext, f);
+               if(verts!=3 && verts!=4) continue;
+               
+
+               // I've decided to let degenerate triangles and group-with-anythings
+               // vary between left/right hand coordinate systems at the vertices.
+               // All healthy triangles on the other hand are built to always be either or.
+
+               /*// force the coordinate system orientation to be uniform for every face.
+               // (this is already the case for good triangles but not for
+               // degenerate ones and those with bGroupWithAnything==true)
+               bool bOrient = psTspace[index].bOrient;
+               if(psTspace[index].iCounter == 0)       // tspace was not derived from a group
+               {
+                       // look for a space created in GenerateTSpaces() by iCounter>0
+                       bool bNotFound = true;
+                       int i=1;
+                       while(i<verts && bNotFound)
+                       {
+                               if(psTspace[index+i].iCounter > 0) bNotFound=false;
+                               else ++i;
+                       }
+                       if(!bNotFound) bOrient = psTspace[index+i].bOrient;
+               }*/
+
+               // set data
+               for(i=0; i<verts; i++)
+               {
+                       const STSpace * pTSpace = &psTspace[index];
+                       float tang[] = {pTSpace->vOs.x, pTSpace->vOs.y, pTSpace->vOs.z};
+                       float bitang[] = {pTSpace->vOt.x, pTSpace->vOt.y, pTSpace->vOt.z};
+                       if(pContext->m_pInterface->m_setTSpace!=NULL)
+                               pContext->m_pInterface->m_setTSpace(pContext, tang, bitang, pTSpace->fMagS, pTSpace->fMagT, pTSpace->bOrient, f, i);
+                       if(pContext->m_pInterface->m_setTSpaceBasic!=NULL)
+                               pContext->m_pInterface->m_setTSpaceBasic(pContext, tang, pTSpace->bOrient==TTRUE ? 1.0f : (-1.0f), f, i);
+
+                       ++index;
+               }
+       }
+
+       free(psTspace);
+
+       
+       return TTRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+typedef struct
+{
+       float vert[3];
+       int index;
+} STmpVert;
+
+const int g_iCells = 2048;
+
+// it is IMPORTANT that this function is called to evaluate the hash since
+// inlining could potentially reorder instructions and generate different
+// results for the same effective input value fVal.
+volatile int FindGridCell(const float fMin, const float fMax, const float fVal)
+{
+       const float fIndex = (g_iCells-1) * ((fVal-fMin)/(fMax-fMin));
+       const int iIndex = fIndex<0?0:((int) (fIndex+0.5f));
+       return iIndex<g_iCells?iIndex:(g_iCells-1);
+}
+
+void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikkTSpaceContext * pContext, const int iL_in, const int iR_in);
+void MergeVertsSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int pTable[], const int iEntries);
+void GenerateSharedVerticesIndexListSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn);
+
+void GenerateSharedVerticesIndexList(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
+{
+
+       // Generate bounding box
+       int * piHashTable=NULL, * piHashCount=NULL, * piHashOffsets=NULL, * piHashCount2=NULL;
+       STmpVert * pTmpVert = NULL;
+       int i=0, iChannel=0, k=0, e=0;
+       int iMaxCount=0;
+       SVec3 vMin = GetPosition(pContext, 0), vMax = vMin, vDim;
+       float fMin, fMax;
+       for(i=1; i<(iNrTrianglesIn*3); i++)
+       {
+               const int index = piTriList_in_and_out[i];
+
+               const SVec3 vP = GetPosition(pContext, index);
+               if(vMin.x > vP.x) vMin.x = vP.x;
+               else if(vMax.x < vP.x) vMax.x = vP.x;
+               if(vMin.y > vP.y) vMin.y = vP.y;
+               else if(vMax.y < vP.y) vMax.y = vP.y;
+               if(vMin.z > vP.z) vMin.z = vP.z;
+               else if(vMax.z < vP.z) vMax.z = vP.z;
+       }
+
+       vDim = vsub(vMax,vMin);
+       iChannel = 0;
+       fMin = vMin.x; fMax=vMax.x;
+       if(vDim.y>vDim.x && vDim.y>vDim.z)
+       {
+               iChannel=1;
+               fMin = vMin.y, fMax=vMax.y;
+       }
+       else if(vDim.z>vDim.x)
+       {
+               iChannel=2;
+               fMin = vMin.z, fMax=vMax.z;
+       }
+
+       // make allocations
+       piHashTable = (int *) malloc(sizeof(int)*iNrTrianglesIn*3);
+       piHashCount = (int *) malloc(sizeof(int)*g_iCells);
+       piHashOffsets = (int *) malloc(sizeof(int)*g_iCells);
+       piHashCount2 = (int *) malloc(sizeof(int)*g_iCells);
+
+       if(piHashTable==NULL || piHashCount==NULL || piHashOffsets==NULL || piHashCount2==NULL)
+       {
+               if(piHashTable!=NULL) free(piHashTable);
+               if(piHashCount!=NULL) free(piHashCount);
+               if(piHashOffsets!=NULL) free(piHashOffsets);
+               if(piHashCount2!=NULL) free(piHashCount2);
+               GenerateSharedVerticesIndexListSlow(piTriList_in_and_out, pContext, iNrTrianglesIn);
+               return;
+       }
+       memset(piHashCount, 0, sizeof(int)*g_iCells);
+       memset(piHashCount2, 0, sizeof(int)*g_iCells);
+
+       // count amount of elements in each cell unit
+       for(i=0; i<(iNrTrianglesIn*3); i++)
+       {
+               const int index = piTriList_in_and_out[i];
+               const SVec3 vP = GetPosition(pContext, index);
+               const float fVal = iChannel==0 ? vP.x : (iChannel==1 ? vP.y : vP.z);
+               const int iCell = FindGridCell(fMin, fMax, fVal);
+               ++piHashCount[iCell];
+       }
+
+       // evaluate start index of each cell.
+       piHashOffsets[0]=0;
+       for(k=1; k<g_iCells; k++)
+               piHashOffsets[k]=piHashOffsets[k-1]+piHashCount[k-1];
+
+       // insert vertices
+       for(i=0; i<(iNrTrianglesIn*3); i++)
+       {
+               const int index = piTriList_in_and_out[i];
+               const SVec3 vP = GetPosition(pContext, index);
+               const float fVal = iChannel==0 ? vP.x : (iChannel==1 ? vP.y : vP.z);
+               const int iCell = FindGridCell(fMin, fMax, fVal);
+               int * pTable = NULL;
+
+               assert(piHashCount2[iCell]<piHashCount[iCell]);
+               pTable = &piHashTable[piHashOffsets[iCell]];
+               pTable[piHashCount2[iCell]] = i;        // vertex i has been inserted.
+               ++piHashCount2[iCell];
+       }
+       for(k=0; k<g_iCells; k++)
+               assert(piHashCount2[k] == piHashCount[k]);      // verify the count
+       free(piHashCount2);
+
+       // find maximum amount of entries in any hash entry
+       iMaxCount = piHashCount[0];
+       for(k=1; k<g_iCells; k++)
+               if(iMaxCount<piHashCount[k])
+                       iMaxCount=piHashCount[k];
+       pTmpVert = (STmpVert *) malloc(sizeof(STmpVert)*iMaxCount);
+       
+
+       // complete the merge
+       for(k=0; k<g_iCells; k++)
+       {
+               // extract table of cell k and amount of entries in it
+               int * pTable = &piHashTable[piHashOffsets[k]];
+               const int iEntries = piHashCount[k];
+               if(iEntries < 2) continue;
+
+               if(pTmpVert!=NULL)
+               {
+                       for(e=0; e<iEntries; e++)
+                       {
+                               int i = pTable[e];
+                               const SVec3 vP = GetPosition(pContext, piTriList_in_and_out[i]);
+                               pTmpVert[e].vert[0] = vP.x; pTmpVert[e].vert[1] = vP.y;
+                               pTmpVert[e].vert[2] = vP.z; pTmpVert[e].index = i;
+                       }
+                       MergeVertsFast(piTriList_in_and_out, pTmpVert, pContext, 0, iEntries-1);
+               }
+               else
+                       MergeVertsSlow(piTriList_in_and_out, pContext, pTable, iEntries);
+       }
+
+       if(pTmpVert!=NULL) { free(pTmpVert); }
+       free(piHashTable);
+       free(piHashCount);
+       free(piHashOffsets);
+}
+
+void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikkTSpaceContext * pContext, const int iL_in, const int iR_in)
+{
+       // make bbox
+       int c=0, l=0, channel=0;
+       float fvMin[3], fvMax[3];
+       float dx=0, dy=0, dz=0, fSep=0;
+       for(c=0; c<3; c++)
+       {       fvMin[c]=pTmpVert[iL_in].vert[c]; fvMax[c]=fvMin[c];    }
+       for(l=(iL_in+1); l<=iR_in; l++)
+               for(c=0; c<3; c++)
+                       if(fvMin[c]>pTmpVert[l].vert[c]) fvMin[c]=pTmpVert[l].vert[c];
+                       else if(fvMax[c]<pTmpVert[l].vert[c]) fvMax[c]=pTmpVert[l].vert[c];
+
+       dx = fvMax[0]-fvMin[0];
+       dy = fvMax[1]-fvMin[1];
+       dz = fvMax[2]-fvMin[2];
+
+       channel = 0;
+       if(dy>dx && dy>dz) channel=1;
+       else if(dz>dx) channel=2;
+
+       fSep = 0.5f*(fvMax[channel]+fvMin[channel]);
+
+       // terminate recursion when the separation/average value
+       // is no longer strictly between fMin and fMax values.
+       if(fSep>=fvMax[channel] || fSep<=fvMin[channel])
+       {
+               // complete the weld
+               for(l=iL_in; l<=iR_in; l++)
+               {
+                       int i = pTmpVert[l].index;
+                       const int index = piTriList_in_and_out[i];
+                       const SVec3 vP = GetPosition(pContext, index);
+                       const SVec3 vN = GetNormal(pContext, index);
+                       const SVec3 vT = GetTexCoord(pContext, index);
+
+                       tbool bNotFound = TTRUE;
+                       int l2=iL_in, i2rec=-1;
+                       while(l2<l && bNotFound)
+                       {
+                               const int i2 = pTmpVert[l2].index;
+                               const int index2 = piTriList_in_and_out[i2];
+                               const SVec3 vP2 = GetPosition(pContext, index2);
+                               const SVec3 vN2 = GetNormal(pContext, index2);
+                               const SVec3 vT2 = GetTexCoord(pContext, index2);
+                               i2rec=i2;
+
+                               //if(vP==vP2 && vN==vN2 && vT==vT2)
+                               if(vP.x==vP2.x && vP.y==vP2.y && vP.z==vP2.z &&
+                                       vN.x==vN2.x && vN.y==vN2.y && vN.z==vN2.z &&
+                                       vT.x==vT2.x && vT.y==vT2.y && vT.z==vT2.z)
+                                       bNotFound = TFALSE;
+                               else
+                                       ++l2;
+                       }
+                       
+                       // merge if previously found
+                       if(!bNotFound)
+                               piTriList_in_and_out[i] = piTriList_in_and_out[i2rec];
+               }
+       }
+       else
+       {
+               int iL=iL_in, iR=iR_in;
+               assert((iR_in-iL_in)>0);        // at least 2 entries
+
+               // seperate (by fSep) all points between iL_in and iR_in in pTmpVert[]
+               while(iL < iR)
+               {
+                       tbool bReadyLeftSwap = TFALSE, bReadyRightSwap = TFALSE;
+                       while((!bReadyLeftSwap) && iL<iR)
+                       {
+                               assert(iL>=iL_in && iL<=iR_in);
+                               bReadyLeftSwap = !(pTmpVert[iL].vert[channel]<fSep);
+                               if(!bReadyLeftSwap) ++iL;
+                       }
+                       while((!bReadyRightSwap) && iL<iR)
+                       {
+                               assert(iR>=iL_in && iR<=iR_in);
+                               bReadyRightSwap = pTmpVert[iR].vert[channel]<fSep;
+                               if(!bReadyRightSwap) --iR;
+                       }
+                       assert( (iL<iR) || !(bReadyLeftSwap && bReadyRightSwap) );
+
+                       if(bReadyLeftSwap && bReadyRightSwap)
+                       {
+                               const STmpVert sTmp = pTmpVert[iL];
+                               assert(iL<iR);
+                               pTmpVert[iL] = pTmpVert[iR];
+                               pTmpVert[iR] = sTmp;
+                               ++iL; --iR;
+                       }
+               }
+
+               assert(iL==(iR+1) || (iL==iR));
+               if(iL==iR)
+               {
+                       const tbool bReadyRightSwap = pTmpVert[iR].vert[channel]<fSep;
+                       if(bReadyRightSwap) ++iL;
+                       else --iR;
+               }
+
+               // only need to weld when there is more than 1 instance of the (x,y,z)
+               if(iL_in < iR)
+                       MergeVertsFast(piTriList_in_and_out, pTmpVert, pContext, iL_in, iR);    // weld all left of fSep
+               if(iL < iR_in)
+                       MergeVertsFast(piTriList_in_and_out, pTmpVert, pContext, iL, iR_in);    // weld all right of (or equal to) fSep
+       }
+}
+
+void MergeVertsSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int pTable[], const int iEntries)
+{
+       // this can be optimized further using a tree structure or more hashing.
+       int e=0;
+       for(e=0; e<iEntries; e++)
+       {
+               int i = pTable[e];
+               const int index = piTriList_in_and_out[i];
+               const SVec3 vP = GetPosition(pContext, index);
+               const SVec3 vN = GetNormal(pContext, index);
+               const SVec3 vT = GetTexCoord(pContext, index);
+
+               tbool bNotFound = TTRUE;
+               int e2=0, i2rec=-1;
+               while(e2<e && bNotFound)
+               {
+                       const int i2 = pTable[e2];
+                       const int index2 = piTriList_in_and_out[i2];
+                       const SVec3 vP2 = GetPosition(pContext, index2);
+                       const SVec3 vN2 = GetNormal(pContext, index2);
+                       const SVec3 vT2 = GetTexCoord(pContext, index2);
+                       i2rec = i2;
+
+                       if(veq(vP,vP2) && veq(vN,vN2) && veq(vT,vT2))
+                               bNotFound = TFALSE;
+                       else
+                               ++e2;
+               }
+               
+               // merge if previously found
+               if(!bNotFound)
+                       piTriList_in_and_out[i] = piTriList_in_and_out[i2rec];
+       }
+}
+
+void GenerateSharedVerticesIndexListSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
+{
+       int iNumUniqueVerts = 0, t=0, i=0;
+       for(t=0; t<iNrTrianglesIn; t++)
+       {
+               for(i=0; i<3; i++)
+               {
+                       const int offs = t*3 + i;
+                       const int index = piTriList_in_and_out[offs];
+
+                       const SVec3 vP = GetPosition(pContext, index);
+                       const SVec3 vN = GetNormal(pContext, index);
+                       const SVec3 vT = GetTexCoord(pContext, index);
+
+                       tbool bFound = TFALSE;
+                       int t2=0, index2rec=-1;
+                       while(!bFound && t2<=t)
+                       {
+                               int j=0;
+                               while(!bFound && j<3)
+                               {
+                                       const int index2 = piTriList_in_and_out[t2*3 + j];
+                                       const SVec3 vP2 = GetPosition(pContext, index2);
+                                       const SVec3 vN2 = GetNormal(pContext, index2);
+                                       const SVec3 vT2 = GetTexCoord(pContext, index2);
+                                       
+                                       if(veq(vP,vP2) && veq(vN,vN2) && veq(vT,vT2))
+                                               bFound = TTRUE;
+                                       else
+                                               ++j;
+                               }
+                               if(!bFound) ++t2;
+                       }
+
+                       assert(bFound);
+                       // if we found our own
+                       if(index2rec == index) { ++iNumUniqueVerts; }
+
+                       piTriList_in_and_out[offs] = index2rec;
+               }
+       }
+}
+
+int GenerateInitialVerticesIndexList(STriInfo pTriInfos[], int piTriList_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
+{
+       int iTSpacesOffs = 0, f=0, t=0;
+       int iDstTriIndex = 0;
+       for(f=0; f<pContext->m_pInterface->m_getNumFaces(pContext); f++)
+       {
+               const int verts = pContext->m_pInterface->m_getNumVerticesOfFace(pContext, f);
+               if(verts!=3 && verts!=4) continue;
+
+               pTriInfos[iDstTriIndex].iOrgFaceNumber = f;
+               pTriInfos[iDstTriIndex].iTSpacesOffs = iTSpacesOffs;
+
+               if(verts==3)
+               {
+                       unsigned char * pVerts = pTriInfos[iDstTriIndex].vert_num;
+                       pVerts[0]=0; pVerts[1]=1; pVerts[2]=2;
+                       piTriList_out[iDstTriIndex*3+0] = MakeIndex(f, 0);
+                       piTriList_out[iDstTriIndex*3+1] = MakeIndex(f, 1);
+                       piTriList_out[iDstTriIndex*3+2] = MakeIndex(f, 2);
+                       ++iDstTriIndex; // next
+               }
+               else
+               {
+                       {
+                               pTriInfos[iDstTriIndex+1].iOrgFaceNumber = f;
+                               pTriInfos[iDstTriIndex+1].iTSpacesOffs = iTSpacesOffs;
+                       }
+
+                       {
+                               // need an order independent way to evaluate
+                               // tspace on quads. This is done by splitting
+                               // along the shortest diagonal.
+                               const int i0 = MakeIndex(f, 0);
+                               const int i1 = MakeIndex(f, 1);
+                               const int i2 = MakeIndex(f, 2);
+                               const int i3 = MakeIndex(f, 3);
+                               const SVec3 T0 = GetTexCoord(pContext, i0);
+                               const SVec3 T1 = GetTexCoord(pContext, i1);
+                               const SVec3 T2 = GetTexCoord(pContext, i2);
+                               const SVec3 T3 = GetTexCoord(pContext, i3);
+                               const float distSQ_02 = LengthSquared(vsub(T2,T0));
+                               const float distSQ_13 = LengthSquared(vsub(T3,T1));
+                               tbool bQuadDiagIs_02;
+                               if(distSQ_02<distSQ_13)
+                                       bQuadDiagIs_02 = TTRUE;
+                               else if(distSQ_13<distSQ_02)
+                                       bQuadDiagIs_02 = TFALSE;
+                               else
+                               {
+                                       const SVec3 P0 = GetPosition(pContext, i0);
+                                       const SVec3 P1 = GetPosition(pContext, i1);
+                                       const SVec3 P2 = GetPosition(pContext, i2);
+                                       const SVec3 P3 = GetPosition(pContext, i3);
+                                       const float distSQ_02 = LengthSquared(vsub(P2,P0));
+                                       const float distSQ_13 = LengthSquared(vsub(P3,P1));
+
+                                       bQuadDiagIs_02 = distSQ_13<distSQ_02 ? TFALSE : TTRUE;
+                               }
+
+                               if(bQuadDiagIs_02)
+                               {
+                                       {
+                                               unsigned char * pVerts_A = pTriInfos[iDstTriIndex].vert_num;
+                                               pVerts_A[0]=0; pVerts_A[1]=1; pVerts_A[2]=2;
+                                       }
+                                       piTriList_out[iDstTriIndex*3+0] = i0;
+                                       piTriList_out[iDstTriIndex*3+1] = i1;
+                                       piTriList_out[iDstTriIndex*3+2] = i2;
+                                       ++iDstTriIndex; // next
+                                       {
+                                               unsigned char * pVerts_B = pTriInfos[iDstTriIndex].vert_num;
+                                               pVerts_B[0]=0; pVerts_B[1]=2; pVerts_B[2]=3;
+                                       }
+                                       piTriList_out[iDstTriIndex*3+0] = i0;
+                                       piTriList_out[iDstTriIndex*3+1] = i2;
+                                       piTriList_out[iDstTriIndex*3+2] = i3;
+                                       ++iDstTriIndex; // next
+                               }
+                               else
+                               {
+                                       {
+                                               unsigned char * pVerts_A = pTriInfos[iDstTriIndex].vert_num;
+                                               pVerts_A[0]=0; pVerts_A[1]=1; pVerts_A[2]=3;
+                                       }
+                                       piTriList_out[iDstTriIndex*3+0] = i0;
+                                       piTriList_out[iDstTriIndex*3+1] = i1;
+                                       piTriList_out[iDstTriIndex*3+2] = i3;
+                                       ++iDstTriIndex; // next
+                                       {
+                                               unsigned char * pVerts_B = pTriInfos[iDstTriIndex].vert_num;
+                                               pVerts_B[0]=1; pVerts_B[1]=2; pVerts_B[2]=3;
+                                       }
+                                       piTriList_out[iDstTriIndex*3+0] = i1;
+                                       piTriList_out[iDstTriIndex*3+1] = i2;
+                                       piTriList_out[iDstTriIndex*3+2] = i3;
+                                       ++iDstTriIndex; // next
+                               }
+                       }
+               }
+
+               iTSpacesOffs += verts;
+               assert(iDstTriIndex<=iNrTrianglesIn);
+       }
+
+       for(t=0; t<iNrTrianglesIn; t++)
+               pTriInfos[t].iFlag = 0;
+
+       // return total amount of tspaces
+       return iTSpacesOffs;
+}
+
+const SVec3 GetPosition(const SMikkTSpaceContext * pContext, const int index)
+{
+       int iF, iI;
+       SVec3 res; float pos[3];
+       IndexToData(&iF, &iI, index);
+       pContext->m_pInterface->m_getPosition(pContext, pos, iF, iI);
+       res.x=pos[0]; res.y=pos[1]; res.z=pos[2];
+       return res;
+}
+
+const SVec3 GetNormal(const SMikkTSpaceContext * pContext, const int index)
+{
+       int iF, iI;
+       SVec3 res; float norm[3];
+       IndexToData(&iF, &iI, index);
+       pContext->m_pInterface->m_getNormal(pContext, norm, iF, iI);
+       res.x=norm[0]; res.y=norm[1]; res.z=norm[2];
+       return res;
+}
+
+const SVec3 GetTexCoord(const SMikkTSpaceContext * pContext, const int index)
+{
+       int iF, iI;
+       SVec3 res; float texc[2];
+       IndexToData(&iF, &iI, index);
+       pContext->m_pInterface->m_getTexCoord(pContext, texc, iF, iI);
+       res.x=texc[0]; res.y=texc[1]; res.z=1.0f;
+       return res;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+
+typedef union
+{
+       struct
+       {
+               int i0, i1, f;
+       };
+       int array[3];
+} SEdge;
+
+void BuildNeighborsFast(STriInfo pTriInfos[], SEdge * pEdges, const int piTriListIn[], const int iNrTrianglesIn);
+void BuildNeighborsSlow(STriInfo pTriInfos[], const int piTriListIn[], const int iNrTrianglesIn);
+
+// returns the texture area times 2
+float CalcTexArea(const SMikkTSpaceContext * pContext, const int indices[])
+{
+       const SVec3 t1 = GetTexCoord(pContext, indices[0]);
+       const SVec3 t2 = GetTexCoord(pContext, indices[1]);
+       const SVec3 t3 = GetTexCoord(pContext, indices[2]);
+
+       const float t21x = t2.x-t1.x;
+       const float t21y = t2.y-t1.y;
+       const float t31x = t3.x-t1.x;
+       const float t31y = t3.y-t1.y;
+
+       const float fSignedAreaSTx2 = t21x*t31y - t21y*t31x;
+
+       return fSignedAreaSTx2<0 ? (-fSignedAreaSTx2) : fSignedAreaSTx2;
+}
+
+void InitTriInfo(STriInfo pTriInfos[], const int piTriListIn[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
+{
+       int f=0, i=0, t=0;
+       // pTriInfos[f].iFlag is cleared in GenerateInitialVerticesIndexList() which is called before this function.
+
+       // generate neighbor info list
+       for(f=0; f<iNrTrianglesIn; f++)
+               for(i=0; i<3; i++)
+               {
+                       pTriInfos[f].FaceNeighbors[i] = -1;
+                       pTriInfos[f].AssignedGroup[i] = NULL;
+
+                       pTriInfos[f].vOs.x=0.0f; pTriInfos[f].vOs.y=0.0f; pTriInfos[f].vOs.z=0.0f;
+                       pTriInfos[f].vOt.x=0.0f; pTriInfos[f].vOt.y=0.0f; pTriInfos[f].vOt.z=0.0f;
+                       pTriInfos[f].fMagS = 0;
+                       pTriInfos[f].fMagT = 0;
+
+                       // assumed bad
+                       pTriInfos[f].iFlag |= GROUP_WITH_ANY;
+               }
+
+       // evaluate first order derivatives
+       for(f=0; f<iNrTrianglesIn; f++)
+       {
+               // initial values
+               const SVec3 v1 = GetPosition(pContext, piTriListIn[f*3+0]);
+               const SVec3 v2 = GetPosition(pContext, piTriListIn[f*3+1]);
+               const SVec3 v3 = GetPosition(pContext, piTriListIn[f*3+2]);
+               const SVec3 t1 = GetTexCoord(pContext, piTriListIn[f*3+0]);
+               const SVec3 t2 = GetTexCoord(pContext, piTriListIn[f*3+1]);
+               const SVec3 t3 = GetTexCoord(pContext, piTriListIn[f*3+2]);
+
+               const float t21x = t2.x-t1.x;
+               const float t21y = t2.y-t1.y;
+               const float t31x = t3.x-t1.x;
+               const float t31y = t3.y-t1.y;
+               const SVec3 d1 = vsub(v2,v1);
+               const SVec3 d2 = vsub(v3,v1);
+
+               const float fSignedAreaSTx2 = t21x*t31y - t21y*t31x;
+               //assert(fSignedAreaSTx2!=0);
+               SVec3 vOs = vsub(vscale(t31y,d1), vscale(t21y,d2));     // eq 18
+               SVec3 vOt = vadd(vscale(-t31x,d1), vscale(t21x,d2)); // eq 19
+
+               pTriInfos[f].iFlag |= (fSignedAreaSTx2>0 ? ORIENT_PRESERVING : 0);
+
+               if( NotZero(fSignedAreaSTx2) )
+               {
+                       const float fAbsArea = fabsf(fSignedAreaSTx2);
+                       const float fLenOs = Length(vOs);
+                       const float fLenOt = Length(vOt);
+                       const float fS = (pTriInfos[f].iFlag&ORIENT_PRESERVING)==0 ? (-1.0f) : 1.0f;
+                       if( NotZero(fLenOs) ) pTriInfos[f].vOs = vscale(fS/fLenOs, vOs);
+                       if( NotZero(fLenOt) ) pTriInfos[f].vOt = vscale(fS/fLenOt, vOt);
+
+                       // evaluate magnitudes prior to normalization of vOs and vOt
+                       pTriInfos[f].fMagS = fLenOs / fAbsArea;
+                       pTriInfos[f].fMagT = fLenOt / fAbsArea;
+
+                       // if this is a good triangle
+                       if( NotZero(pTriInfos[f].fMagS) && NotZero(pTriInfos[f].fMagT))
+                               pTriInfos[f].iFlag &= (~GROUP_WITH_ANY);
+               }
+       }
+
+       // force otherwise healthy quads to a fixed orientation
+       while(t<(iNrTrianglesIn-1))
+       {
+               const int iFO_a = pTriInfos[t].iOrgFaceNumber;
+               const int iFO_b = pTriInfos[t+1].iOrgFaceNumber;
+               if(iFO_a==iFO_b)        // this is a quad
+               {
+                       const tbool bIsDeg_a = (pTriInfos[t].iFlag&MARK_DEGENERATE)!=0 ? TTRUE : TFALSE;
+                       const tbool bIsDeg_b = (pTriInfos[t+1].iFlag&MARK_DEGENERATE)!=0 ? TTRUE : TFALSE;
+                       
+                       // bad triangles should already have been removed by
+                       // DegenPrologue(), but just in case check bIsDeg_a and bIsDeg_a are false
+                       if((bIsDeg_a||bIsDeg_b)==TFALSE)
+                       {
+                               const tbool bOrientA = (pTriInfos[t].iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+                               const tbool bOrientB = (pTriInfos[t+1].iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+                               // if this happens the quad has extremely bad mapping!!
+                               if(bOrientA!=bOrientB)
+                               {
+                                       //printf("found quad with bad mapping\n");
+                                       tbool bChooseOrientFirstTri = TFALSE;
+                                       if((pTriInfos[t+1].iFlag&GROUP_WITH_ANY)!=0) bChooseOrientFirstTri = TTRUE;
+                                       else if( CalcTexArea(pContext, &piTriListIn[t*3+0]) >= CalcTexArea(pContext, &piTriListIn[(t+1)*3+0]) )
+                                               bChooseOrientFirstTri = TTRUE;
+
+                                       // force match
+                                       {
+                                               const int t0 = bChooseOrientFirstTri ? t : (t+1);
+                                               const int t1 = bChooseOrientFirstTri ? (t+1) : t;
+                                               pTriInfos[t1].iFlag &= (~ORIENT_PRESERVING);    // clear first
+                                               pTriInfos[t1].iFlag |= (pTriInfos[t0].iFlag&ORIENT_PRESERVING); // copy bit
+                                       }
+                               }
+                       }
+                       t += 2;
+               }
+               else
+                       ++t;
+       }
+       
+       // match up edge pairs
+       {
+               SEdge * pEdges = (SEdge *) malloc(sizeof(SEdge)*iNrTrianglesIn*3);
+               if(pEdges==NULL)
+                       BuildNeighborsSlow(pTriInfos, piTriListIn, iNrTrianglesIn);
+               else
+               {
+                       BuildNeighborsFast(pTriInfos, pEdges, piTriListIn, iNrTrianglesIn);
+       
+                       free(pEdges);
+               }
+       }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+
+tbool AssignRecur(const int piTriListIn[], STriInfo psTriInfos[], const int iMyTriIndex, SGroup * pGroup);
+void AddTriToGroup(SGroup * pGroup, const int iTriIndex);
+
+int Build4RuleGroups(STriInfo pTriInfos[], SGroup pGroups[], int piGroupTrianglesBuffer[], const int piTriListIn[], const int iNrTrianglesIn)
+{
+       const int iNrMaxGroups = iNrTrianglesIn*3;
+       int iNrActiveGroups = 0;
+       int iOffset = 0, f=0, i=0;
+       for(f=0; f<iNrTrianglesIn; f++)
+       {
+               for(i=0; i<3; i++)
+               {
+                       // if not assigned to a group
+                       if((pTriInfos[f].iFlag&GROUP_WITH_ANY)==0 && pTriInfos[f].AssignedGroup[i]==NULL)
+                       {
+                               tbool bOrPre;
+                               int neigh_indexL, neigh_indexR;
+                               const int vert_index = piTriListIn[f*3+i];
+                               assert(iNrActiveGroups<iNrMaxGroups);
+                               pTriInfos[f].AssignedGroup[i] = &pGroups[iNrActiveGroups];
+                               pTriInfos[f].AssignedGroup[i]->iVertexRepresentitive = vert_index;
+                               pTriInfos[f].AssignedGroup[i]->bOrientPreservering = (pTriInfos[f].iFlag&ORIENT_PRESERVING)!=0;
+                               pTriInfos[f].AssignedGroup[i]->iNrFaces = 0;
+                               pTriInfos[f].AssignedGroup[i]->pFaceIndices = &piGroupTrianglesBuffer[iOffset];
+                               ++iNrActiveGroups;
+
+                               AddTriToGroup(pTriInfos[f].AssignedGroup[i], f);
+                               bOrPre = (pTriInfos[f].iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+                               neigh_indexL = pTriInfos[f].FaceNeighbors[i];
+                               neigh_indexR = pTriInfos[f].FaceNeighbors[i>0?(i-1):2];
+                               if(neigh_indexL>=0) // neighbor
+                               {
+                                       const tbool bAnswer =
+                                               AssignRecur(piTriListIn, pTriInfos, neigh_indexL,
+                                                                       pTriInfos[f].AssignedGroup[i] );
+                                       
+                                       const tbool bOrPre2 = (pTriInfos[neigh_indexL].iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+                                       const tbool bDiff = bOrPre!=bOrPre2 ? TTRUE : TFALSE;
+                                       assert(bAnswer || bDiff);
+                               }
+                               if(neigh_indexR>=0) // neighbor
+                               {
+                                       const tbool bAnswer =
+                                               AssignRecur(piTriListIn, pTriInfos, neigh_indexR,
+                                                                       pTriInfos[f].AssignedGroup[i] );
+
+                                       const tbool bOrPre2 = (pTriInfos[neigh_indexR].iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+                                       const tbool bDiff = bOrPre!=bOrPre2 ? TTRUE : TFALSE;
+                                       assert(bAnswer || bDiff);
+                               }
+
+                               // update offset
+                               iOffset += pTriInfos[f].AssignedGroup[i]->iNrFaces;
+                               // since the groups are disjoint a triangle can never
+                               // belong to more than 3 groups. Subsequently something
+                               // is completely screwed if this assertion ever hits.
+                               assert(iOffset <= iNrMaxGroups);
+                       }
+               }
+       }
+
+       return iNrActiveGroups;
+}
+
+void AddTriToGroup(SGroup * pGroup, const int iTriIndex)
+{
+       pGroup->pFaceIndices[pGroup->iNrFaces] = iTriIndex;
+       ++pGroup->iNrFaces;
+}
+
+tbool AssignRecur(const int piTriListIn[], STriInfo psTriInfos[],
+                                const int iMyTriIndex, SGroup * pGroup)
+{
+       STriInfo * pMyTriInfo = &psTriInfos[iMyTriIndex];
+
+       // track down vertex
+       const int iVertRep = pGroup->iVertexRepresentitive;
+       const int * pVerts = &piTriListIn[3*iMyTriIndex+0];
+       int i=-1;
+       if(pVerts[0]==iVertRep) i=0;
+       else if(pVerts[1]==iVertRep) i=1;
+       else if(pVerts[2]==iVertRep) i=2;
+       assert(i>=0 && i<3);
+
+       // early out
+       if(pMyTriInfo->AssignedGroup[i] == pGroup) return TTRUE;
+       else if(pMyTriInfo->AssignedGroup[i]!=NULL) return TFALSE;
+       if((pMyTriInfo->iFlag&GROUP_WITH_ANY)!=0)
+       {
+               // first to group with a group-with-anything triangle
+               // determines it's orientation.
+               // This is the only existing order dependency in the code!!
+               if( pMyTriInfo->AssignedGroup[0] == NULL &&
+                       pMyTriInfo->AssignedGroup[1] == NULL &&
+                       pMyTriInfo->AssignedGroup[2] == NULL )
+               {
+                       pMyTriInfo->iFlag &= (~ORIENT_PRESERVING);
+                       pMyTriInfo->iFlag |= (pGroup->bOrientPreservering ? ORIENT_PRESERVING : 0);
+               }
+       }
+       {
+               const tbool bOrient = (pMyTriInfo->iFlag&ORIENT_PRESERVING)!=0 ? TTRUE : TFALSE;
+               if(bOrient != pGroup->bOrientPreservering) return TFALSE;
+       }
+
+       AddTriToGroup(pGroup, iMyTriIndex);
+       pMyTriInfo->AssignedGroup[i] = pGroup;
+
+       {
+               const int neigh_indexL = pMyTriInfo->FaceNeighbors[i];
+               const int neigh_indexR = pMyTriInfo->FaceNeighbors[i>0?(i-1):2];
+               if(neigh_indexL>=0)
+                       AssignRecur(piTriListIn, psTriInfos, neigh_indexL, pGroup);
+               if(neigh_indexR>=0)
+                       AssignRecur(piTriListIn, psTriInfos, neigh_indexR, pGroup);
+       }
+
+
+
+       return TTRUE;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+
+tbool CompareSubGroups(const SSubGroup * pg1, const SSubGroup * pg2);
+void QuickSort(int* pSortBuffer, int iLeft, int iRight, unsigned int uSeed);
+STSpace EvalTspace(int face_indices[], const int iFaces, const int piTriListIn[], const STriInfo pTriInfos[], const SMikkTSpaceContext * pContext, const int iVertexRepresentitive);
+
+tbool GenerateTSpaces(STSpace psTspace[], const STriInfo pTriInfos[], const SGroup pGroups[],
+                                        const int iNrActiveGroups, const int piTriListIn[], const float fThresCos,
+                                        const SMikkTSpaceContext * pContext)
+{
+       STSpace * pSubGroupTspace = NULL;
+       SSubGroup * pUniSubGroups = NULL;
+       int * pTmpMembers = NULL;
+       int iMaxNrFaces=0, iUniqueTspaces=0, g=0, i=0;
+       for(g=0; g<iNrActiveGroups; g++)
+               if(iMaxNrFaces < pGroups[g].iNrFaces)
+                       iMaxNrFaces = pGroups[g].iNrFaces;
+
+       if(iMaxNrFaces == 0) return TTRUE;
+
+       // make initial allocations
+       pSubGroupTspace = (STSpace *) malloc(sizeof(STSpace)*iMaxNrFaces);
+       pUniSubGroups = (SSubGroup *) malloc(sizeof(SSubGroup)*iMaxNrFaces);
+       pTmpMembers = (int *) malloc(sizeof(int)*iMaxNrFaces);
+       if(pSubGroupTspace==NULL || pUniSubGroups==NULL || pTmpMembers==NULL)
+       {
+               if(pSubGroupTspace!=NULL) free(pSubGroupTspace);        
+               if(pUniSubGroups!=NULL) free(pUniSubGroups);    
+               if(pTmpMembers!=NULL) free(pTmpMembers);        
+               return TFALSE;
+       }
+
+
+       iUniqueTspaces = 0;
+       for(g=0; g<iNrActiveGroups; g++)
+       {
+               const SGroup * pGroup = &pGroups[g];
+               int iUniqueSubGroups = 0, s=0;
+
+               for(i=0; i<pGroup->iNrFaces; i++)       // triangles
+               {
+                       const int f = pGroup->pFaceIndices[i];  // triangle number
+                       int index=-1, iVertIndex=-1, iOF_1=-1, iMembers=0, j=0, l=0;
+                       SSubGroup tmp_group;
+                       tbool bFound;
+                       SVec3 n, vOs, vOt;
+                       if(pTriInfos[f].AssignedGroup[0]==pGroup) index=0;
+                       else if(pTriInfos[f].AssignedGroup[1]==pGroup) index=1;
+                       else if(pTriInfos[f].AssignedGroup[2]==pGroup) index=2;
+                       assert(index>=0 && index<3);
+
+                       iVertIndex = piTriListIn[f*3+index];
+                       assert(iVertIndex==pGroup->iVertexRepresentitive);
+
+                       // is normalized already
+                       n = GetNormal(pContext, iVertIndex);
+                       
+                       // project
+                       vOs = vsub(pTriInfos[f].vOs, vscale(vdot(n,pTriInfos[f].vOs), n));
+                       vOt = vsub(pTriInfos[f].vOt, vscale(vdot(n,pTriInfos[f].vOt), n));
+                       if( VNotZero(vOs) ) vOs = Normalize(vOs);
+                       if( VNotZero(vOt) ) vOt = Normalize(vOt);
+
+                       // original face number
+                       iOF_1 = pTriInfos[f].iOrgFaceNumber;
+                       
+                       iMembers = 0;
+                       for(j=0; j<pGroup->iNrFaces; j++)
+                       {
+                               const int t = pGroup->pFaceIndices[j];  // triangle number
+                               const int iOF_2 = pTriInfos[t].iOrgFaceNumber;
+
+                               // project
+                               SVec3 vOs2 = vsub(pTriInfos[t].vOs, vscale(vdot(n,pTriInfos[t].vOs), n));
+                               SVec3 vOt2 = vsub(pTriInfos[t].vOt, vscale(vdot(n,pTriInfos[t].vOt), n));
+                               if( VNotZero(vOs2) ) vOs2 = Normalize(vOs2);
+                               if( VNotZero(vOt2) ) vOt2 = Normalize(vOt2);
+
+                               {
+                                       const tbool bAny = ( (pTriInfos[f].iFlag | pTriInfos[t].iFlag) & GROUP_WITH_ANY )!=0 ? TTRUE : TFALSE;
+                                       // make sure triangles which belong to the same quad are joined.
+                                       const tbool bSameOrgFace = iOF_1==iOF_2 ? TTRUE : TFALSE;
+
+                                       const float fCosS = vdot(vOs,vOs2);
+                                       const float fCosT = vdot(vOt,vOt2);
+
+                                       assert(f!=t || bSameOrgFace);   // sanity check
+                                       if(bAny || bSameOrgFace || (fCosS>fThresCos && fCosT>fThresCos))
+                                               pTmpMembers[iMembers++] = t;
+                               }
+                       }
+
+                       // sort pTmpMembers
+                       tmp_group.iNrFaces = iMembers;
+                       tmp_group.pTriMembers = pTmpMembers;
+                       if(iMembers>1)
+                       {
+                               unsigned int uSeed = INTERNAL_RND_SORT_SEED;    // could replace with a random seed?
+                               QuickSort(pTmpMembers, 0, iMembers-1, uSeed);
+                       }
+
+                       // look for an existing match
+                       bFound = TFALSE;
+                       l=0;
+                       while(l<iUniqueSubGroups && !bFound)
+                       {
+                               bFound = CompareSubGroups(&tmp_group, &pUniSubGroups[l]);
+                               if(!bFound) ++l;
+                       }
+                       
+                       // assign tangent space index
+                       assert(bFound || l==iUniqueSubGroups);
+                       //piTempTangIndices[f*3+index] = iUniqueTspaces+l;
+
+                       // if no match was found we allocate a new subgroup
+                       if(!bFound)
+                       {
+                               // insert new subgroup
+                               int * pIndices = (int *) malloc(sizeof(int)*iMembers);
+                               if(pIndices==NULL)
+                               {
+                                       // clean up and return false
+                                       int s=0;
+                                       for(s=0; s<iUniqueSubGroups; s++)
+                                               free(pUniSubGroups[s].pTriMembers);
+                                       free(pUniSubGroups);
+                                       free(pTmpMembers);
+                                       free(pSubGroupTspace);
+                                       return TFALSE;
+                               }
+                               pUniSubGroups[iUniqueSubGroups].iNrFaces = iMembers;
+                               pUniSubGroups[iUniqueSubGroups].pTriMembers = pIndices;
+                               memcpy(pIndices, tmp_group.pTriMembers, iMembers*sizeof(int));
+                               pSubGroupTspace[iUniqueSubGroups] =
+                                       EvalTspace(tmp_group.pTriMembers, iMembers, piTriListIn, pTriInfos, pContext, pGroup->iVertexRepresentitive);
+                               ++iUniqueSubGroups;
+                       }
+
+                       // output tspace
+                       {
+                               const int iOffs = pTriInfos[f].iTSpacesOffs;
+                               const int iVert = pTriInfos[f].vert_num[index];
+                               STSpace * pTS_out = &psTspace[iOffs+iVert];
+                               assert(pTS_out->iCounter<2);
+                               assert(((pTriInfos[f].iFlag&ORIENT_PRESERVING)!=0) == pGroup->bOrientPreservering);
+                               if(pTS_out->iCounter==1)
+                               {
+                                       *pTS_out = AvgTSpace(pTS_out, &pSubGroupTspace[l]);
+                                       pTS_out->iCounter = 2;  // update counter
+                                       pTS_out->bOrient = pGroup->bOrientPreservering;
+                               }
+                               else
+                               {
+                                       assert(pTS_out->iCounter==0);
+                                       *pTS_out = pSubGroupTspace[l];
+                                       pTS_out->iCounter = 1;  // update counter
+                                       pTS_out->bOrient = pGroup->bOrientPreservering;
+                               }
+                       }
+               }
+
+               // clean up and offset iUniqueTspaces
+               for(s=0; s<iUniqueSubGroups; s++)
+                       free(pUniSubGroups[s].pTriMembers);
+               iUniqueTspaces += iUniqueSubGroups;
+               iUniqueSubGroups = 0;
+       }
+
+       // clean up
+       free(pUniSubGroups);
+       free(pTmpMembers);
+       free(pSubGroupTspace);
+
+       return TTRUE;
+}
+
+STSpace EvalTspace(int face_indices[], const int iFaces, const int piTriListIn[], const STriInfo pTriInfos[],
+                                  const SMikkTSpaceContext * pContext, const int iVertexRepresentitive)
+{
+       STSpace res;
+       float fAngleSum = 0;
+       int face=0;
+       res.vOs.x=0.0f; res.vOs.y=0.0f; res.vOs.z=0.0f;
+       res.vOt.x=0.0f; res.vOt.y=0.0f; res.vOt.z=0.0f;
+       res.fMagS = 0; res.fMagT = 0;
+
+       for(face=0; face<iFaces; face++)
+       {
+               const int f = face_indices[face];
+
+               // only valid triangles get to add their contribution
+               if( (pTriInfos[f].iFlag&GROUP_WITH_ANY)==0 )
+               {
+                       SVec3 n, vOs, vOt, p0, p1, p2, v1, v2;
+                       float fCos, fAngle, fMagS, fMagT;
+                       int i=-1, index=-1, i0=-1, i1=-1, i2=-1;
+                       if(piTriListIn[3*f+0]==iVertexRepresentitive) i=0;
+                       else if(piTriListIn[3*f+1]==iVertexRepresentitive) i=1;
+                       else if(piTriListIn[3*f+2]==iVertexRepresentitive) i=2;
+                       assert(i>=0 && i<3);
+
+                       // project
+                       index = piTriListIn[3*f+i];
+                       n = GetNormal(pContext, index);
+                       vOs = vsub(pTriInfos[f].vOs, vscale(vdot(n,pTriInfos[f].vOs), n));
+                       vOt = vsub(pTriInfos[f].vOt, vscale(vdot(n,pTriInfos[f].vOt), n));
+                       if( VNotZero(vOs) ) vOs = Normalize(vOs);
+                       if( VNotZero(vOt) ) vOt = Normalize(vOt);
+
+                       i2 = piTriListIn[3*f + (i<2?(i+1):0)];
+                       i1 = piTriListIn[3*f + i];
+                       i0 = piTriListIn[3*f + (i>0?(i-1):2)];
+
+                       p0 = GetPosition(pContext, i0);
+                       p1 = GetPosition(pContext, i1);
+                       p2 = GetPosition(pContext, i2);
+                       v1 = vsub(p0,p1);
+                       v2 = vsub(p2,p1);
+
+                       // project
+                       v1 = vsub(v1, vscale(vdot(n,v1),n)); if( VNotZero(v1) ) v1 = Normalize(v1);
+                       v2 = vsub(v2, vscale(vdot(n,v2),n)); if( VNotZero(v2) ) v2 = Normalize(v2);
+
+                       // weight contribution by the angle
+                       // between the two edge vectors
+                       fCos = vdot(v1,v2); fCos=fCos>1?1:(fCos<(-1) ? (-1) : fCos);
+                       fAngle = (const float) acos(fCos);
+                       fMagS = pTriInfos[f].fMagS;
+                       fMagT = pTriInfos[f].fMagT;
+
+                       res.vOs=vadd(res.vOs, vscale(fAngle,vOs));
+                       res.vOt=vadd(res.vOt,vscale(fAngle,vOt));
+                       res.fMagS+=(fAngle*fMagS);
+                       res.fMagT+=(fAngle*fMagT);
+                       fAngleSum += fAngle;
+               }
+       }
+
+       // normalize
+       if( VNotZero(res.vOs) ) res.vOs = Normalize(res.vOs);
+       if( VNotZero(res.vOt) ) res.vOt = Normalize(res.vOt);
+       if(fAngleSum>0)
+       {
+               res.fMagS /= fAngleSum;
+               res.fMagT /= fAngleSum;
+       }
+
+       return res;
+}
+
+tbool CompareSubGroups(const SSubGroup * pg1, const SSubGroup * pg2)
+{
+       tbool bStillSame=TTRUE;
+       int i=0;
+       if(pg1->iNrFaces!=pg2->iNrFaces) return TFALSE;
+       while(i<pg1->iNrFaces && bStillSame)
+       {
+               bStillSame = pg1->pTriMembers[i]==pg2->pTriMembers[i] ? TTRUE : TFALSE;
+               if(bStillSame) ++i;
+       }
+       return bStillSame;
+}
+
+void QuickSort(int* pSortBuffer, int iLeft, int iRight, unsigned int uSeed)
+{
+       int iL, iR, n, index, iMid, iTmp;
+
+       // Random
+       unsigned int t=uSeed&31;
+       t=(uSeed<<t)|(uSeed>>(32-t));
+       uSeed=uSeed+t+3;
+       // Random end
+
+       iL=iLeft; iR=iRight;
+       n = (iR-iL)+1;
+       assert(n>=0);
+       index = (int) (uSeed%n);
+
+       iMid=pSortBuffer[index + iL];
+       iTmp;
+
+       do
+       {
+               while(pSortBuffer[iL] < iMid)
+                       ++iL;
+               while(pSortBuffer[iR] > iMid)
+                       --iR;
+
+               if(iL <= iR)
+               {
+                       iTmp = pSortBuffer[iL];
+                       pSortBuffer[iL] = pSortBuffer[iR];
+                       pSortBuffer[iR] = iTmp;
+                       ++iL; --iR;
+               }
+       }
+       while(iL <= iR);
+
+       if(iLeft < iR)
+               QuickSort(pSortBuffer, iLeft, iR, uSeed);
+       if(iL < iRight)
+               QuickSort(pSortBuffer, iL, iRight, uSeed);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+void QuickSortEdges(SEdge * pSortBuffer, int iLeft, int iRight, const int channel, unsigned int uSeed);
+void GetEdge(int * i0_out, int * i1_out, int * edgenum_out, const int indices[], const int i0_in, const int i1_in);
+
+void BuildNeighborsFast(STriInfo pTriInfos[], SEdge * pEdges, const int piTriListIn[], const int iNrTrianglesIn)
+{
+       // build array of edges
+       unsigned int uSeed = INTERNAL_RND_SORT_SEED;                            // could replace with a random seed?
+       int iEntries=0, iCurStartIndex=-1, f=0, i=0;
+       for(f=0; f<iNrTrianglesIn; f++)
+               for(i=0; i<3; i++)
+               {
+                       const int i0 = piTriListIn[f*3+i];
+                       const int i1 = piTriListIn[f*3+(i<2?(i+1):0)];
+                       pEdges[f*3+i].i0 = i0 < i1 ? i0 : i1;                   // put minimum index in i0
+                       pEdges[f*3+i].i1 = !(i0 < i1) ? i0 : i1;                // put maximum index in i1
+                       pEdges[f*3+i].f = f;                                                    // record face number
+               }
+
+       // sort over all edges by i0, this is the pricy one.
+       QuickSortEdges(pEdges, 0, iNrTrianglesIn*3-1, 0, uSeed);        // sort channel 0 which is i0
+
+       // sub sort over i1, should be fast.
+       // could replace this with a 64 bit int sort over (i0,i1)
+       // with i0 as msb in the quicksort call above.
+       iEntries = iNrTrianglesIn*3;
+       iCurStartIndex = 0;
+       for(i=1; i<iEntries; i++)
+       {
+               if(pEdges[iCurStartIndex].i0 != pEdges[i].i0)
+               {
+                       const int iL = iCurStartIndex;
+                       const int iR = i-1;
+                       //const int iElems = i-iL;
+                       iCurStartIndex = i;
+                       QuickSortEdges(pEdges, iL, iR, 1, uSeed);       // sort channel 1 which is i1
+               }
+       }
+
+       // sub sort over f, which should be fast.
+       // this step is to remain compliant with BuildNeighborsSlow() when
+       // more than 2 triangles use the same edge (such as a butterfly topology).
+       iCurStartIndex = 0;
+       for(i=1; i<iEntries; i++)
+       {
+               if(pEdges[iCurStartIndex].i0 != pEdges[i].i0 || pEdges[iCurStartIndex].i1 != pEdges[i].i1)
+               {
+                       const int iL = iCurStartIndex;
+                       const int iR = i-1;
+                       //const int iElems = i-iL;
+                       iCurStartIndex = i;
+                       QuickSortEdges(pEdges, iL, iR, 2, uSeed);       // sort channel 2 which is f
+               }
+       }
+
+       // pair up, adjacent triangles
+       for(i=0; i<iEntries; i++)
+       {
+               const int i0=pEdges[i].i0;
+               const int i1=pEdges[i].i1;
+               const int f = pEdges[i].f;
+               tbool bUnassigned_A;
+
+               int i0_A, i1_A;
+               int edgenum_A, edgenum_B=0;     // 0,1 or 2
+               GetEdge(&i0_A, &i1_A, &edgenum_A, &piTriListIn[f*3], i0, i1);   // resolve index ordering and edge_num
+               bUnassigned_A = pTriInfos[f].FaceNeighbors[edgenum_A] == -1 ? TTRUE : TFALSE;
+
+               if(bUnassigned_A)
+               {
+                       // get true index ordering
+                       int j=i+1, t;
+                       tbool bNotFound = TTRUE;
+                       while(j<iEntries && i0==pEdges[j].i0 && i1==pEdges[j].i1 && bNotFound)
+                       {
+                               tbool bUnassigned_B;
+                               int i0_B, i1_B;
+                               t = pEdges[j].f;
+                               // flip i0_B and i1_B
+                               GetEdge(&i1_B, &i0_B, &edgenum_B, &piTriListIn[t*3], pEdges[j].i0, pEdges[j].i1);       // resolve index ordering and edge_num
+                               //assert(!(i0_A==i1_B && i1_A==i0_B));
+                               bUnassigned_B =  pTriInfos[t].FaceNeighbors[edgenum_B]==-1 ? TTRUE : TFALSE;
+                               if(i0_A==i0_B && i1_A==i1_B && bUnassigned_B)
+                                       bNotFound = TFALSE;
+                               else
+                                       ++j;
+                       }
+
+                       if(!bNotFound)
+                       {
+                               int t = pEdges[j].f;
+                               pTriInfos[f].FaceNeighbors[edgenum_A] = t;
+                               //assert(pTriInfos[t].FaceNeighbors[edgenum_B]==-1);
+                               pTriInfos[t].FaceNeighbors[edgenum_B] = f;
+                       }
+               }
+       }
+}
+
+void BuildNeighborsSlow(STriInfo pTriInfos[], const int piTriListIn[], const int iNrTrianglesIn)
+{
+       int f=0, i=0;
+       for(f=0; f<iNrTrianglesIn; f++)
+       {
+               for(i=0; i<3; i++)
+               {
+                       // if unassigned
+                       if(pTriInfos[f].FaceNeighbors[i] == -1)
+                       {
+                               const int i0_A = piTriListIn[f*3+i];
+                               const int i1_A = piTriListIn[f*3+(i<2?(i+1):0)];
+
+                               // search for a neighbor
+                               tbool bFound = TFALSE;
+                               int t=0, j=0;
+                               while(!bFound && t<iNrTrianglesIn)
+                               {
+                                       if(t!=f)
+                                       {
+                                               j=0;
+                                               while(!bFound && j<3)
+                                               {
+                                                       // in rev order
+                                                       const int i1_B = piTriListIn[t*3+j];
+                                                       const int i0_B = piTriListIn[t*3+(j<2?(j+1):0)];
+                                                       //assert(!(i0_A==i1_B && i1_A==i0_B));
+                                                       if(i0_A==i0_B && i1_A==i1_B)
+                                                               bFound = TTRUE;
+                                                       else
+                                                               ++j;
+                                               }
+                                       }
+                                       
+                                       if(!bFound) ++t;
+                               }
+
+                               // assign neighbors
+                               if(bFound)
+                               {
+                                       pTriInfos[f].FaceNeighbors[i] = t;
+                                       //assert(pTriInfos[t].FaceNeighbors[j]==-1);
+                                       pTriInfos[t].FaceNeighbors[j] = f;
+                               }
+                       }
+               }
+       }
+}
+
+void QuickSortEdges(SEdge * pSortBuffer, int iLeft, int iRight, const int channel, unsigned int uSeed)
+{
+       unsigned int t;
+       int iL, iR, n, index, iMid;
+
+       // early out
+       SEdge sTmp;
+       const int iElems = iRight-iLeft+1;
+       if(iElems<2) return;
+       else if(iElems==2)
+       {
+               if(pSortBuffer[iLeft].array[channel] > pSortBuffer[iRight].array[channel])
+               {
+                       sTmp = pSortBuffer[iLeft];
+                       pSortBuffer[iLeft] = pSortBuffer[iRight];
+                       pSortBuffer[iRight] = sTmp;
+               }
+               return;
+       }
+
+       // Random
+       t=uSeed&31;
+       t=(uSeed<<t)|(uSeed>>(32-t));
+       uSeed=uSeed+t+3;
+       // Random end
+
+       iL=iLeft, iR=iRight;
+       n = (iR-iL)+1;
+       assert(n>=0);
+       index = (int) (uSeed%n);
+
+       iMid=pSortBuffer[index + iL].array[channel];
+
+       do
+       {
+               while(pSortBuffer[iL].array[channel] < iMid)
+                       ++iL;
+               while(pSortBuffer[iR].array[channel] > iMid)
+                       --iR;
+
+               if(iL <= iR)
+               {
+                       sTmp = pSortBuffer[iL];
+                       pSortBuffer[iL] = pSortBuffer[iR];
+                       pSortBuffer[iR] = sTmp;
+                       ++iL; --iR;
+               }
+       }
+       while(iL <= iR);
+
+       if(iLeft < iR)
+               QuickSortEdges(pSortBuffer, iLeft, iR, channel, uSeed);
+       if(iL < iRight)
+               QuickSortEdges(pSortBuffer, iL, iRight, channel, uSeed);
+}
+
+// resolve ordering and edge number
+void GetEdge(int * i0_out, int * i1_out, int * edgenum_out, const int indices[], const int i0_in, const int i1_in)
+{
+       *edgenum_out = -1;
+       
+       // test if first index is on the edge
+       if(indices[0]==i0_in || indices[0]==i1_in)
+       {
+               // test if second index is on the edge
+               if(indices[1]==i0_in || indices[1]==i1_in)
+               {
+                       edgenum_out[0]=0;       // first edge
+                       i0_out[0]=indices[0];
+                       i1_out[0]=indices[1];
+               }
+               else
+               {
+                       edgenum_out[0]=2;       // third edge
+                       i0_out[0]=indices[2];
+                       i1_out[0]=indices[0];
+               }
+       }
+       else
+       {
+               // only second and third index is on the edge
+               edgenum_out[0]=1;       // second edge
+               i0_out[0]=indices[1];
+               i1_out[0]=indices[2];
+       }
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////// Degenerate triangles ////////////////////////////////////
+
+void DegenPrologue(STriInfo pTriInfos[], int piTriList_out[], const int iNrTrianglesIn, const int iTotTris)
+{
+       int iNextGoodTriangleSearchIndex=-1;
+       tbool bStillFindingGoodOnes;
+
+       // locate quads with only one good triangle
+       int t=0;
+       while(t<(iTotTris-1))
+       {
+               const int iFO_a = pTriInfos[t].iOrgFaceNumber;
+               const int iFO_b = pTriInfos[t+1].iOrgFaceNumber;
+               if(iFO_a==iFO_b)        // this is a quad
+               {
+                       const tbool bIsDeg_a = (pTriInfos[t].iFlag&MARK_DEGENERATE)!=0 ? TTRUE : TFALSE;
+                       const tbool bIsDeg_b = (pTriInfos[t+1].iFlag&MARK_DEGENERATE)!=0 ? TTRUE : TFALSE;
+                       if((bIsDeg_a^bIsDeg_b)!=0)
+                       {
+                               pTriInfos[t].iFlag |= QUAD_ONE_DEGEN_TRI;
+                               pTriInfos[t+1].iFlag |= QUAD_ONE_DEGEN_TRI;
+                       }
+                       t += 2;
+               }
+               else
+                       ++t;
+       }
+
+       // reorder list so all degen triangles are moved to the back
+       // without reordering the good triangles
+       iNextGoodTriangleSearchIndex = 1;
+       t=0;
+       bStillFindingGoodOnes = TTRUE;
+       while(t<iNrTrianglesIn && bStillFindingGoodOnes)
+       {
+               const tbool bIsGood = (pTriInfos[t].iFlag&MARK_DEGENERATE)==0 ? TTRUE : TFALSE;
+               if(bIsGood)
+               {
+                       if(iNextGoodTriangleSearchIndex < (t+2))
+                               iNextGoodTriangleSearchIndex = t+2;
+               }
+               else
+               {
+                       int t0, t1;
+                       // search for the first good triangle.
+                       tbool bJustADegenerate = TTRUE;
+                       while(bJustADegenerate && iNextGoodTriangleSearchIndex<iTotTris)
+                       {
+                               const tbool bIsGood = (pTriInfos[iNextGoodTriangleSearchIndex].iFlag&MARK_DEGENERATE)==0 ? TTRUE : TFALSE;
+                               if(bIsGood) bJustADegenerate=TFALSE;
+                               else ++iNextGoodTriangleSearchIndex;
+                       }
+
+                       t0 = t;
+                       t1 = iNextGoodTriangleSearchIndex;
+                       ++iNextGoodTriangleSearchIndex;
+                       assert(iNextGoodTriangleSearchIndex > (t+1));
+
+                       // swap triangle t0 and t1
+                       if(!bJustADegenerate)
+                       {
+                               int i=0;
+                               for(i=0; i<3; i++)
+                               {
+                                       const int index = piTriList_out[t0*3+i];
+                                       piTriList_out[t0*3+i] = piTriList_out[t1*3+i];
+                                       piTriList_out[t1*3+i] = index;
+                               }
+                               {
+                                       const STriInfo tri_info = pTriInfos[t0];
+                                       pTriInfos[t0] = pTriInfos[t1];
+                                       pTriInfos[t1] = tri_info;
+                               }
+                       }
+                       else
+                               bStillFindingGoodOnes = TFALSE; // this is not supposed to happen
+               }
+
+               if(bStillFindingGoodOnes) ++t;
+       }
+
+       assert(bStillFindingGoodOnes);  // code will still work.
+       assert(iNrTrianglesIn == t);
+}
+
+void DegenEpilogue(STSpace psTspace[], STriInfo pTriInfos[], int piTriListIn[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn, const int iTotTris)
+{
+       int t=0, i=0;
+       // deal with degenerate triangles
+       // punishment for degenerate triangles is O(N^2)
+       for(t=iNrTrianglesIn; t<iTotTris; t++)
+       {
+               // degenerate triangles on a quad with one good triangle are skipped
+               // here but processed in the next loop
+               const tbool bSkip = (pTriInfos[t].iFlag&QUAD_ONE_DEGEN_TRI)!=0 ? TTRUE : TFALSE;
+
+               if(!bSkip)
+               {
+                       for(i=0; i<3; i++)
+                       {
+                               const int index1 = piTriListIn[t*3+i];
+                               // search through the good triangles
+                               tbool bNotFound = TTRUE;
+                               int j=0;
+                               while(bNotFound && j<(3*iNrTrianglesIn))
+                               {
+                                       const int index2 = piTriListIn[j];
+                                       if(index1==index2) bNotFound=TFALSE;
+                                       else ++j;
+                               }
+
+                               if(!bNotFound)
+                               {
+                                       const int iTri = j/3;
+                                       const int iVert = j%3;
+                                       const int iSrcVert=pTriInfos[iTri].vert_num[iVert];
+                                       const int iSrcOffs=pTriInfos[iTri].iTSpacesOffs;
+                                       const int iDstVert=pTriInfos[t].vert_num[i];
+                                       const int iDstOffs=pTriInfos[t].iTSpacesOffs;
+                                       
+                                       // copy tspace
+                                       psTspace[iDstOffs+iDstVert] = psTspace[iSrcOffs+iSrcVert];
+                               }
+                       }
+               }
+       }
+
+       // deal with degenerate quads with one good triangle
+       for(t=0; t<iNrTrianglesIn; t++)
+       {
+               // this triangle belongs to a quad where the
+               // other triangle is degenerate
+               if( (pTriInfos[t].iFlag&QUAD_ONE_DEGEN_TRI)!=0 )
+               {
+                       SVec3 vDstP;
+                       int iOrgF=-1, i=0;
+                       tbool bNotFound;
+                       unsigned char * pV = pTriInfos[t].vert_num;
+                       int iFlag = (1<<pV[0]) | (1<<pV[1]) | (1<<pV[2]);
+                       int iMissingIndex = 0;
+                       if((iFlag&2)==0) iMissingIndex=1;
+                       else if((iFlag&4)==0) iMissingIndex=2;
+                       else if((iFlag&8)==0) iMissingIndex=3;
+
+                       iOrgF = pTriInfos[t].iOrgFaceNumber;
+                       vDstP = GetPosition(pContext, MakeIndex(iOrgF, iMissingIndex));
+                       bNotFound = TTRUE;
+                       i=0;
+                       while(bNotFound && i<3)
+                       {
+                               const int iVert = pV[i];
+                               const SVec3 vSrcP = GetPosition(pContext, MakeIndex(iOrgF, iVert));
+                               if(veq(vSrcP, vDstP)==TTRUE)
+                               {
+                                       const int iOffs = pTriInfos[t].iTSpacesOffs;
+                                       psTspace[iOffs+iMissingIndex] = psTspace[iOffs+iVert];
+                                       bNotFound=TFALSE;
+                               }
+                               else
+                                       ++i;
+                       }
+                       assert(!bNotFound);
+               }
+       }
+}
index a2d3016..0889f49 100644 (file)
@@ -1392,7 +1392,7 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v
        }                                                                                                                                                       \
        if(attribs.tottang) {                                                                                                           \
                float *tang = attribs.tang.array[a*4 + vert];                                                   \
-               glVertexAttrib3fvARB(attribs.tang.glIndex, tang);                                               \
+               glVertexAttrib4fvARB(attribs.tang.glIndex, tang);                                               \
        }                                                                                                                                                       \
 }
 
diff --git a/source/blender/blenkernel/mikktspace.h b/source/blender/blenkernel/mikktspace.h
new file mode 100644 (file)
index 0000000..7775667
--- /dev/null
@@ -0,0 +1,143 @@
+/**
+ *  Copyright (C) 2011 by Morten S. Mikkelsen
+ *
+ *  This software is provided 'as-is', without any express or implied
+ *  warranty.  In no event will the authors be held liable for any damages
+ *  arising from the use of this software.
+ *
+ *  Permission is granted to anyone to use this software for any purpose,
+ *  including commercial applications, and to alter it and redistribute it
+ *  freely, subject to the following restrictions:
+ *
+ *  1. The origin of this software must not be misrepresented; you must not
+ *     claim that you wrote the original software. If you use this software
+ *     in a product, an acknowledgment in the product documentation would be
+ *     appreciated but is not required.
+ *  2. Altered source versions must be plainly marked as such, and must not be
+ *     misrepresented as being the original software.
+ *  3. This notice may not be removed or altered from any source distribution.
+ */
+
+#ifndef __MIKKTSPACE_H__
+#define __MIKKTSPACE_H__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Author: Morten S. Mikkelsen
+ * Version: 1.0
+ *
+ * The files mikktspace.h and mikktspace.c are designed to be
+ * stand-alone files and it is important that they are kept this way.
+ * Not having dependencies on structures/classes/libraries specific
+ * to the program, in which they are used, allows them to be copied
+ * and used as is into any tool, program or plugin.
+ * The code is designed to consistently generate the same
+ * tangent spaces, for a given mesh, in any tool in which it is used.
+ * This is done by performing an internal welding step and subsequently an order-independent evaluation
+ * of tangent space for meshes consisting of triangles and quads.
+ * This means faces can be received in any order and the same is true for
+ * the order of vertices of each face. The generated result will not be affected
+ * by such reordering. Additionally, whether degenerate (vertices or texture coordinates)
+ * primitives are present or not will not affect the generated results either.
+ * Once tangent space calculation is done the vertices of degenerate primitives will simply
+ * inherit tangent space from neighboring non degenerate primitives.
+ * The analysis behind this implementation can be found in my master's thesis
+ * which is available for download --> http://image.diku.dk/projects/media/morten.mikkelsen.08.pdf
+ * Note that though the tangent spaces at the vertices are generated in an order-independent way,
+ * by this implementation, the interpolated tangent space is still affected by which diagonal is
+ * chosen to split each quad. A sensible solution is to have your tools pipeline always
+ * split quads by the shortest diagonal. This choice is order-independent and works with mirroring.
+ * If these have the same length then compare the diagonals defined by the texture coordinates.
+ * XNormal which is a tool for baking normal maps allows you to write your own tangent space plugin
+ * and also quad triangulator plugin.
+ */
+
+
+typedef int tbool;
+typedef struct SMikkTSpaceContext SMikkTSpaceContext;
+
+typedef struct
+{
+       // Returns the number of faces (triangles/quads) on the mesh to be processed.
+       int (*m_getNumFaces)(const SMikkTSpaceContext * pContext);
+
+       // Returns the number of vertices on face number iFace
+       // iFace is a number in the range {0, 1, ..., getNumFaces()-1}
+       int (*m_getNumVerticesOfFace)(const SMikkTSpaceContext * pContext, const int iFace);
+
+       // returns the position/normal/texcoord of the referenced face of vertex number iVert.
+       // iVert is in the range {0,1,2} for triangles and {0,1,2,3} for quads.
+       void (*m_getPosition)(const SMikkTSpaceContext * pContext, float fvPosOut[], const int iFace, const int iVert);
+       void (*m_getNormal)(const SMikkTSpaceContext * pContext, float fvNormOut[], const int iFace, const int iVert);
+       void (*m_getTexCoord)(const SMikkTSpaceContext * pContext, float fvTexcOut[], const int iFace, const int iVert);
+
+       // either (or both) of the two setTSpace callbacks can be set.
+       // The call-back m_setTSpaceBasic() is sufficient for basic normal mapping.
+
+       // This function is used to return the tangent and fSign to the application.
+       // fvTangent is a unit length vector.
+       // For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level.
+       // bitangent = fSign * cross(vN, tangent);
+       // Note that the results are returned unindexed. It is possible to generate a new index list
+       // But averaging/overwriting tangent spaces by using an already existing index list WILL produce INCRORRECT results.
+       // DO NOT! use an already existing index list.
+       void (*m_setTSpaceBasic)(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert);
+
+       // This function is used to return tangent space results to the application.
+       // fvTangent and fvBiTangent are unit length vectors and fMagS and fMagT are their
+       // true magnitudes which can be used for relief mapping effects.
+       // fvBiTangent is the "real" bitangent and thus may not be perpendicular to fvTangent.
+       // However, both are perpendicular to the vertex normal.
+       // For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level.
+       // fSign = bIsOrientationPreserving ? 1.0f : (-1.0f);
+       // bitangent = fSign * cross(vN, tangent);
+       // Note that the results are returned unindexed. It is possible to generate a new index list
+       // But averaging/overwriting tangent spaces by using an already existing index list WILL produce INCRORRECT results.
+       // DO NOT! use an already existing index list.
+       void (*m_setTSpace)(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
+                                               const tbool bIsOrientationPreserving, const int iFace, const int iVert);
+} SMikkTSpaceInterface;
+
+struct SMikkTSpaceContext
+{
+       SMikkTSpaceInterface * m_pInterface;    // initialized with callback functions
+       void * m_pUserData;                                             // pointer to client side mesh data etc. (passed as the first parameter with every interface call)
+};
+
+// these are both thread safe!
+tbool genTangSpaceDefault(const SMikkTSpaceContext * pContext);        // Default (recommended) fAngularThreshold is 180 degrees (which means threshold disabled)
+tbool genTangSpace(const SMikkTSpaceContext * pContext, const float fAngularThreshold);
+
+
+// To avoid visual errors (distortions/unwanted hard edges in lighting), when using sampled normal maps, the
+// normal map sampler must use the exact inverse of the pixel shader transformation.
+// The most efficient transformation we can possibly do in the pixel shader is
+// achieved by using, directly, the "unnormalized" interpolated tangent, bitangent and vertex normal: vT, vB and vN.
+// pixel shader (fast transform out)
+// vNout = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN );
+// where vNt is the tangent space normal. The normal map sampler must likewise use the
+// interpolated and "unnormalized" tangent, bitangent and vertex normal to be compliant with the pixel shader.
+// sampler does (exact inverse of pixel shader):
+// float3 row0 = cross(vB, vN);
+// float3 row1 = cross(vN, vT);
+// float3 row2 = cross(vT, vB);
+// float fSign = dot(vT, row0)<0 ? -1 : 1;
+// vNt = normalize( fSign * float3(dot(vNout,row0), dot(vNout,row1), dot(vNout,row2)) );
+// where vNout is the sampled normal in some chosen 3D space.
+//
+// Should you choose to reconstruct the bitangent in the pixel shader instead
+// of the vertex shader, as explained earlier, then be sure to do this in the normal map sampler also.
+// Finally, beware of quad triangulations. If the normal map sampler doesn't use the same triangulation of
+// quads as your renderer then problems will occur since the interpolated tangent spaces will differ
+// eventhough the vertex level tangent spaces match. This can be solved either by triangulating before
+// sampling/exporting or by using the order-independent choice of diagonal for splitting quads suggested earlier.
+// However, this must be used both by the sampler and your tools/rendering pipeline.
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
index 8fc96b3..98b09d0 100644 (file)
@@ -741,11 +741,12 @@ static char *code_generate_vertex(ListBase *nodes)
                for (input=node->inputs.first; input; input=input->next)
                        if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
                                if(input->attribtype == CD_TANGENT) /* silly exception */
-                                       BLI_dynstr_printf(ds, "\tvar%d = gl_NormalMatrix * ", input->attribid);
+                               {
+                                       BLI_dynstr_printf(ds, "\tvar%d.xyz = normalize((gl_ModelViewMatrix * vec4(att%d.xyz, 0)).xyz);\n", input->attribid, input->attribid);
+                                       BLI_dynstr_printf(ds, "\tvar%d.w = att%d.w;\n", input->attribid, input->attribid);
+                               }
                                else
-                                       BLI_dynstr_printf(ds, "\tvar%d = ", input->attribid);
-
-                               BLI_dynstr_printf(ds, "att%d;\n", input->attribid);
+                                       BLI_dynstr_printf(ds, "\tvar%d = att%d;\n", input->attribid, input->attribid);
                        }
 
        BLI_dynstr_append(ds, "}\n\n");
index cb28d0d..fb8c746 100644 (file)
@@ -894,6 +894,7 @@ static void do_material_tex(GPUShadeInput *shi)
        int tex_nr, rgbnor, talpha;
        int init_done = 0, iBumpSpacePrev;
        GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude;
+       int iFirstTimeNMap=1;
 
        GPU_link(mat, "set_value", GPU_uniform(&one), &stencil);
 
@@ -902,7 +903,7 @@ static void do_material_tex(GPUShadeInput *shi)
        GPU_link(mat, "texco_object", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
                GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
                GPU_builtin(GPU_VIEW_POSITION), &texco_object);
-       GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent);
+       //GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent);
        GPU_link(mat, "texco_global", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
                GPU_builtin(GPU_VIEW_POSITION), &texco_global);
 
@@ -1037,7 +1038,20 @@ static void do_material_tex(GPUShadeInput *shi)
                                                        GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor);
 
                                                if(mtex->normapspace == MTEX_NSPACE_TANGENT)
-                                                       GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
+                                               {
+                                                       if(iFirstTimeNMap!=0)
+                                                       {
+                                                               // use unnormalized normal (this is how we bake it - closer to gamedev)
+                                                               GPUNodeLink *vNegNorm;
+                                                               GPU_link(mat, "vec_math_negate", GPU_builtin(GPU_VIEW_NORMAL), &vNegNorm);
+                                                               GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), vNegNorm, tnor, &newnor);
+                                                               iFirstTimeNMap = 0;
+                                                       }
+                                                       else    // otherwise use accumulated perturbations
+                                                       {
+                                                               GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
+                                                       }
+                                               }
                                                else
                                                        newnor = tnor;
                                                
index 6dec6a5..47f4774 100644 (file)
@@ -746,9 +746,9 @@ void texco_norm(vec3 normal, out vec3 outnormal)
        outnormal = normalize(normal);
 }
 
-void texco_tangent(vec3 tangent, out vec3 outtangent)
+void texco_tangent(vec4 tangent, out vec3 outtangent)
 {
-       outtangent = normalize(tangent);
+       outtangent = normalize(tangent.xyz);
 }
 
 void texco_global(mat4 viewinvmat, vec3 co, out vec3 global)
@@ -1250,12 +1250,11 @@ void mtex_negate_texnormal(vec3 normal, out vec3 outnormal)
        outnormal = vec3(-normal.x, -normal.y, normal.z);
 }
 
-void mtex_nspace_tangent(vec3 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
+void mtex_nspace_tangent(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
 {
-       tangent = normalize(tangent);
-       vec3 B = cross(normal, tangent);
+       vec3 B = tangent.w * cross(normal, tangent.xyz);
 
-       outnormal = texnormal.x*tangent + texnormal.y*B + texnormal.z*normal;
+       outnormal = texnormal.x*tangent.xyz + texnormal.y*B + texnormal.z*normal;
        outnormal = normalize(outnormal);
 }
 
index 742e57f..cd325cb 100644 (file)
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 38724;
+int datatoc_gpu_shader_material_glsl_size= 38717;
 char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111,
- 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,
-110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115,
- 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109,
- 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59,
- 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44,
- 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10,
- 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32,
- 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48,
- 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,
-123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,
-101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41,
- 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61,
- 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61,
- 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,
-101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104,
- 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49,
- 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,
-114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,
-104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,105,
- 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51, 32,114,103, 98,
- 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10,  9,118, 32,
- 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 32, 61,
- 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9,105,102, 40,
-104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46,
- 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,
-  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61, 32,118, 42, 40,
- 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10,  9,  9,116,
- 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,  9,105,102, 32,
- 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,
-  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,
-113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,
-103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105,
- 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,
-101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44,
- 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,
-113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,
-119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,
-108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,  9,114,101,116,
-117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46,
- 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48,
- 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,
-108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102,
- 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46,
- 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,
-114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48,
- 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101,
- 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,
-  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,
-108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,
-105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32,
- 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59,
- 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100,
- 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61,
- 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,
-  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,
-108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98,
- 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32,
- 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46,
- 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47,
- 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,
-111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99,
- 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53,
- 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32,
- 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,
-119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,
-118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59,
- 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,111, 98,
- 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48,
- 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,116,116,
-114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,
-114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,
-110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,114,105,
- 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107, 32,
- 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44,
- 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,
-118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116,
- 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,105,
-110, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44,
- 32,109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,
-116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
-118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,
-111, 46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,117,
-116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
- 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
+ 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123,
+ 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,
+110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,
+109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103,
+ 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,
+114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120,
+ 45, 99,109,105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46,
+ 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,
+115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61,
+ 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,
+  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,
+103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109,
+ 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,
+114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99,
+ 91, 50, 93, 59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48,
+ 93, 59, 10, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,
+  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44,
+ 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103,
+ 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,
+102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,
+101, 99, 51, 32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91,
+ 49, 93, 59, 10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,
+  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,
+123, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,
+104, 32, 42, 61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,
+104, 32, 45, 32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,
+112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102,
+ 41, 41, 59, 10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,
+  9, 10,  9,  9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,
+116, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32,
+ 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61,
+ 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,
+101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44,
+ 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,
+118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51,
+ 40,118, 44, 32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103,
+ 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101,
+ 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53,
+ 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40,
+ 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119, 40, 40,
+ 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10,
+ 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99,
+ 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,110, 32,
+ 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101,
+ 10,  9,  9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52,
+ 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,
+114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,
+ 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,
+114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,
+103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,
+108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,
+114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,
+125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,
+111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108,
+ 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,
+111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,
+115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,
+110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,
+108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32,
+ 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99,
+ 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,
+108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,
+108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,
+118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,
+117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109,
+ 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101,
+ 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,
+111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,
+108, 32, 61, 32, 99,111, 59, 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41,
+ 59, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99,
+ 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,
+  9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,
+108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,
+114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,
+108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,
+110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101,
+ 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,
+101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,
+111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99,
+ 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,
+105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,
+111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46,
+ 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32,
+ 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,
+111, 41, 59, 10,  9,111,117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
+ 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
+ 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,
+117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,
-108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116,
+108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121,
  40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,
-108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,
-118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111,
- 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102,
- 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,  9,
-101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,
-111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,
-111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,
-116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,
-105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48,
- 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
-111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,
-102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,
-105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,
-  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,
-118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,
+108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,
+108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61,
+ 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,
+108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,
+105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111,
  97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
-118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,
-119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,
-  9,  9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,115,
-101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,
-111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38,
- 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108,
- 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61,
- 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108,
- 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
- 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
- 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
-116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,
-118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32,
- 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108,
- 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49,
- 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104,
- 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,
-118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59,
- 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115,
- 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46,
- 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44,
+118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,
+103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32,
+ 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,
+101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
+104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32,
+ 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,
+101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,
+116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62,
+ 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50,
+ 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62,
+ 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,
+111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
+111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,
+111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,
+108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49,
+ 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,
+108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110,
+ 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,
+111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,
+111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,
+118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,
+116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,
+112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,
+105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101,
+ 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,
+ 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93,
+ 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91,
+ 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,
+101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,
+118, 49, 32, 45, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48,
+ 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99,
+ 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114,
+ 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,
+117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
+101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,
+117,116,118,101, 99, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,
+101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118,
+ 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,
+ 48, 44, 32, 48, 44, 32, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44,
  32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50,
- 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,
-115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51,
- 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99,
- 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49,
- 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59,
- 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51,
- 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48,
- 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118,
- 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59,
- 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99, 32,
- 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104,
- 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123,
- 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51,
- 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,100,
-105,114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51,
- 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101,
- 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,
-120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,
-112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99,
- 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32,
- 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41,
- 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42,
- 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,
-117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116,
- 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10,  9,111,117,
-116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,
-116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10,  9,111,
-117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,
-120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10,
-  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116,
- 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,117,
-116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,
-101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,
-118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,
-116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99,
- 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,
-108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46,
- 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,
-111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108,
- 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,
-123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97,
- 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,
-108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,
-108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,
+108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118,
+ 49, 44, 32,118, 50, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99,
+ 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,
+111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,
+101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,117,116,118, 41, 10,123, 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109,
+ 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,
+110,111,114, 32, 61, 32,100,105,114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,
+111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97,
+ 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,
+116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48,
+ 41, 42, 48, 46, 53, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40,
+ 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10,
+  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,
+ 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32,
+ 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32,
+ 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,
+101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,
+108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
+ 10,123, 10,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,
+112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41,
+ 46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109,
+ 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97,
+ 41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,
+109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46,
+ 97, 41, 46, 98, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108,
+ 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41,
+ 41, 59, 10, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108,
+ 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,
+103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
+ 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,
+101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
+ 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46,
+ 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,
+117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
+ 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59,
+ 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
+ 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32,
+ 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,
+109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,
+116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,
+116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
+ 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,
+109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
+ 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,
+108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32,
+ 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45,
+ 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116,
+ 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,
+108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
+111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,
+108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
+ 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,
+  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42,
+ 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,
+  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97,
+ 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,
+114, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,
+108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,
+108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50,
+ 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,
+116, 99,111,108, 46,103, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,
+111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,
+ 98, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
+109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48,
+ 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,
 111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
 117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
  97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108,
- 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32,
- 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116,
- 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
- 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32,
- 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,
-111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,
+ 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32,
+ 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,
 102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,
 101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32,
  48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
- 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52,
- 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41,
- 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61,
- 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
- 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116,
- 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32,
- 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108,
- 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32,
- 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,105,
-102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,
-102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,108,115,101, 10,  9,  9,111,
-117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42,
- 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41,
- 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,
- 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,101,108,115,
-101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
- 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,
-111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99,
- 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52,
- 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
- 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49,
- 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46,
- 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
- 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
- 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
- 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,
-117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48,
- 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,
- 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32,
- 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,
-102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40, 99,111,108, 50, 46, 98, 32,
- 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98,
- 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97,
- 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,
-108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,
-102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
- 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,
-102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116,
- 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98,
- 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
+ 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114,
+ 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
+114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40, 99,111,108,
+ 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
+111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,
+ 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,
+117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
+ 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32,
+ 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
+ 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
+111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
+ 41, 59, 10,  9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,
+111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
+ 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44,
+ 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
+ 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
+ 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,
+111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
+  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,
+112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,
+111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
+ 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
+  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,
+  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49,
+ 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,
+112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,
+108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,
+116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49,
+ 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
+ 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,
+116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,
+116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98,
+ 32, 61, 32,116,109,112, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,
+116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
+ 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,116,109,
+112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40,116,109,112, 32, 60,
+ 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,
+102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41,
+ 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,
+  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
+ 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10,  9,
+116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,116,109,112,
+ 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101,
+ 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,
+103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48,
+ 59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103,
+ 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,
+ 10,  9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,105,102, 40,116,
+109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,
+115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
+108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48,
+ 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108,
+ 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
+ 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
+111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
+ 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,
+116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,
+109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,
+102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,
+111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,
+  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116, 99,
+111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,117,
+116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
+115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
+111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,
+108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
+ 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,
+  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116,
+ 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
+  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,  9,104,115,118,
+ 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10,  9,  9,
+104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,  9,125, 10,125, 10, 10,118,
+111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
+  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,
+111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118,
+ 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10,
+  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,104,115,118, 46,122,
+ 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10,  9,104,115,118,
+ 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
+120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
+ 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99,
+ 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,
+102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108,
+ 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,
+111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33,
+ 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,
+118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,
+104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32,
+ 10, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97,
+ 99, 41, 59, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,
+111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
  49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
- 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,
-117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,
-103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
- 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,
-  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42,
- 99,111,108, 50, 46,114, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,
-111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116,
- 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,
- 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10,  9,
-125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116,
- 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,  9,105,102, 40,116,109,
-112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,
-108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46,
- 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,
-111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32,
- 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
- 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,
-116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,
-117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32,
- 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59,
- 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
- 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
- 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,116,109,112, 32, 61, 32,102, 97, 99,
-109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
-  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32,
- 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32,
- 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,
-102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,
-101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32, 61, 32,102,
- 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
- 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,
-112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41,
- 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101,
- 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59,
- 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32, 61,
- 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48,
- 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,
-116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,
-112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,
-115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46,
- 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
- 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,
-102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111,
- 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,
- 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103,
- 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,
-121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44,
- 32,104,115,118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 95,116,
-111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,
-120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32,
- 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
- 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,
-115,118, 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,
-118, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,
-111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,102, 97,
- 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,116,111, 95,
-114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
- 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32,
- 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,
-109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59,
- 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10,  9,114,103, 98, 95,116,111,
- 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109,
- 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10,  9,104,115,118, 95,116,111, 95,114,103, 98,
- 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114,
- 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
-112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
- 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101,
- 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,
-111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,
-123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,  9,  9,104,
-115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59,
- 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116,
- 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,
-117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
- 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
- 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61,
- 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97,
- 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52,
- 40, 49, 46, 48, 41, 59, 10,  9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,
-111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,
-109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42,
- 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,
-110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32,
- 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61,
- 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,
-111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32,
- 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,
-114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,  9,
-105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108,
- 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,
-  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40,
- 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46, 98,
- 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99,
- 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,
-117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50,
- 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41,
- 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44,
- 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,
-118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114,
- 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48,
- 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110,
- 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,
-111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 46,120,121,122, 32, 61,
- 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48,
- 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,
-111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44,
- 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
- 10,  9,118,101, 99, 52, 32,104,115,118, 59, 10, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,
-118, 41, 59, 10, 10,  9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10,  9,105,102,
- 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,
-102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10,  9,104,115,118,
- 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10,  9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91,
- 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118,
- 91, 49, 93, 61, 32, 48, 46, 48, 59, 10,  9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10,  9,105,102, 40,
-104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102,
- 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10,  9,104,115,118, 95,
-116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,
-109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10,  9,
-114, 32, 61, 32, 99,111,108, 46,114, 59, 10,  9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10,  9, 98, 32, 61, 32, 99,111,108, 46,
- 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,
-102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,
-123, 10,  9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116,
- 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10,  9,111,117,116,114,
-103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101,
- 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,
-101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,
-101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59,
- 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51,
- 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
-108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,  9,
-111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,
-101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,
- 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,
-111,114,109, 97,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,
-101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122,
- 41, 42, 50, 48, 46, 48, 59, 10,  9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,
-110, 40, 97, 41, 59, 10, 10,  9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10,  9, 99,111,108,111,114, 32, 61, 32,118,101, 99,
- 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32,118,101,
- 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,
-114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,
-114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9, 99,111,108,111,114, 32, 61, 32,116,
-101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48,
- 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10,  9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10,  9,110,111,
-114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10,  9,110,
-111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10,  9,
-110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,
-125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32,
- 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10,  9,111,114, 99,111, 32,
- 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50,
- 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9, 47, 42, 32,100,105,115, 97, 98,
-108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104,
- 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10,  9, 32, 32,
- 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44,
- 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118,
- 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,
-110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,  9, 47,
- 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104,
- 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10,  9, 32, 32, 32,111,117,116, 32, 98,
-108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10,  9,111,117,116,110,111,
-114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10,  9,111,117,116,116, 97,110,103,101,110,116,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,
-101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99,
- 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10,  9,103,108,111, 98, 97,108,
- 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,
-122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,
-119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10,  9,111, 98,106,101, 99,116, 32, 61, 32, 40,111,
- 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48,
- 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51,
- 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10,
-  9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,
-118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109,
- 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,  9, 47, 42, 32, 98,108,
-101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42,
- 47, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,
-117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,
-108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109,
- 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
-111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
-103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42,
- 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,110, 99,111,
-108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,
-116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,
-111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32,
- 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32,
- 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32,
- 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,
-117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,
-108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109,
- 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53,
- 41, 10,  9,  9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50,
- 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108,
- 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48,
- 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10,
- 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46,103, 32, 61,
- 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46,103, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102,
- 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41,
- 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98,
- 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97,
- 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10,  9,101,108,115,101, 10,  9,
-  9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
-116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
-108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,
-111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,
-105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,
-111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,
+ 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,
+108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,111,110,
+101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,  9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,
+111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,
+108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49,
+ 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
+  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10,  9,111,
+117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41,
+ 10,  9,  9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40,
+ 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114,
+ 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49,
+ 46, 48, 41, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108,
+ 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32,
+ 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32,
+ 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,  9,105,102,
+ 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46,
+ 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,
+108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46,
+ 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,
+114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,
+112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116, 97,108,112,104, 97, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,
+108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108,
+ 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,
+ 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,
+108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115,
+ 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32,
+ 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
+ 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,
+108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49,
+ 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,
+108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111,
+ 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32,104,115,118, 59, 10, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,
+ 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46,
+ 53, 41, 59, 10,  9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59,
+ 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46,
+ 48, 59, 10,  9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10,  9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46,
+ 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48,
+ 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10,  9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,
+101, 59, 10,  9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,
+101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59,
+ 10, 10,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10,  9,111,117,
+116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32, 98, 41, 10,123, 10,  9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10,  9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10,  9, 98,
+ 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,
+111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99,
+ 52, 32, 99,111,108, 41, 10,123, 10,  9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46,
+ 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98,
+ 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,
+123, 10,  9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41,
+ 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,
+108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,
+123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,
+116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,
+120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117,
+ 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32,
+ 48, 46, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100,
+ 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,
+118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,
+122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10,  9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43,
+ 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10,  9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10,  9, 99,111,108,111,
+114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10,  9,110,111,114,109,
+ 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,
+114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9, 99,111,
+108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,
+101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10,  9,118, 97,108,117,101, 32, 61, 32, 49, 46,
+ 48, 59, 10, 10,  9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48,
+ 46, 53, 41, 59, 10,  9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,
+114, 46,103, 41, 59, 10,  9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45,
+ 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,
+111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123,
+ 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,
+117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9, 47,
+ 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,
+101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,
+105,110,103, 10,  9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101,
+ 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10,  9,117,118, 32, 61, 32,118,101, 99,
+ 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,
+109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
+108, 41, 10,123, 10,  9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110,
+ 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10,  9, 32,
+ 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47,
+ 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,
+101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10,  9,111,117,116,
+116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,
+105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108,
+ 41, 10,123, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,
+111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101,
+ 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,
+116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10,  9,
+111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,
+101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,
+111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,114,101,102, 41, 10,123, 10,  9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116,
+ 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,
+109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
+108, 41, 10,123, 10,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,
+115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,
+108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,
+108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,
+102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,110, 99,111,108, 32,
+ 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,
+101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,
+109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102,
+ 97, 99,103, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,
+111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,
+101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
+110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102,
+ 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,110, 99,111,108, 32, 61,
+ 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42,
+ 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41,
+ 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,
+114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,
+102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,102, 40,111,117,116,
+ 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,
+114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10,  9,101,
+108,115,101, 10,  9,  9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
+ 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
+111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,
+  9,  9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
+ 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 46,103,
+ 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45,
+ 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10,  9,
+105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,
+117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,
+ 98, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
+109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40,
+ 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,105,110, 99,111,108, 41, 10,123, 10,  9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,
+120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,
+ 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
+110, 99,111,108, 41, 10,123, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,
+108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118,
+ 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
+108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
+ 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,102, 40,116,101,120, 99,111,108, 46,
+114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
+114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10,  9,105,102, 40,
+116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,
+111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,
+103, 59, 10,  9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32,
+ 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,
+116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,
+118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
+102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
+ 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59,
+ 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,
+109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116,
+ 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51,
+ 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
+  9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
+ 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116,
+ 42,116,101,120, 99,111,108, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,
+110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116,
+ 99,111,108, 46,114, 59, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10,  9,105,102,
+ 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,
+101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10,  9, 99,111,108, 32, 61, 32,
+102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10,  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,
+ 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61,
+ 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,
+116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
+116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
+111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10,  9,102, 97, 99,116, 32, 42,
+ 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9, 99,111,108, 32,
+ 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,
+108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114,
+ 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,
+103, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61,
+ 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10,  9,
+ 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,
+117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,
+111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,105,110, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,105,120, 95,104,117,101, 40,102,
+ 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99,
+ 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,  9,105,110, 99,111,108, 46,114,103, 98,
+ 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116,
+ 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
+108, 41, 10,123, 10,  9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102,
+ 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120,
+ 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,
+108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51,
+ 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
+  9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,
+118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32,
+ 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,
 116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,105,110,
- 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116,
- 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49,
- 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,
-110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,
-116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10,  9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,
-102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10,  9,105,102, 40,116,101,120, 99,
-111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
-111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125,
- 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,
-102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
- 44, 32, 99,111,108, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49,
- 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10,
-  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,
-108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10,  9, 99,111,108,
- 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10,  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,
-111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,
-103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108,
- 46, 98, 59, 10,  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32,
- 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,
-111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
- 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,
-116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97,
- 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
-111,108, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,
-114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114,
- 59, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10,  9,105,102, 40, 99,111,108, 32,
- 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,
-105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10,  9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 46, 98, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110,
- 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,
-111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,
-111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,
-118,101, 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,
+108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,118,101,
+ 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,
 101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49,
  46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32,
- 99,111,108, 59, 10, 10,  9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
-117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
- 99,111,108, 41, 59, 10,  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32, 99,111,108, 59, 10,
- 10,  9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108,
- 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59,
- 10,  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,
-116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10,  9,109,
-105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44,
- 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,
-  9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10,  9,102,
- 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
- 99,116, 59, 10, 10,  9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,
-109,112, 32, 61, 32,102, 97, 99,116, 59, 10,  9,  9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10,  9,  9,102, 97, 99,109,
- 32, 61, 32,116,109,112, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,
-101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,
-108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,105,110,
- 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,
-116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,
-102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,
-116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
- 97, 99,103, 59, 10,  9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,
-114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118,
- 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102,
- 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10,  9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45,
- 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49,
- 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
- 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118,
- 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102,
- 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,
-100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,102, 97, 99,109, 41, 10,123, 10,  9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10,  9,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,
+123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10,  9,  9,102, 97, 99,116, 32, 61, 32,102,
+ 97, 99,109, 59, 10,  9,  9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111,
+ 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,
+109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,
+102, 97, 99,109, 41, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102,
+ 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,
+117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
 108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
  32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,
 117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102, 97, 99,
-116, 32, 61, 32,102, 97, 99,116, 59, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43,
- 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,105,102, 40,116,101,120,
- 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10,  9,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,
-108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10,  9,101,108,115,101, 10,  9,  9,
-105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,
-100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118,
- 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,105,
-110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,
-120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
-111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,
-120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
- 10,  9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,  9,105,102, 40, 99,
-111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
-110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
-101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
-111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,109,116,101,
-120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
- 10,  9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,  9,105,102, 40, 99,
-111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
-110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
-101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10,  9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,
-112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123,
- 10,  9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104,
- 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10,  9,111,117,116,104, 97,114, 32,
- 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,
-108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,104, 97,114, 41, 10,123, 10,  9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10,  9,105,102, 40,
-104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 32,105,
-102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10,  9,
-101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
- 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10,  9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
-102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
-  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10,  9,105,110,116,101,110,115,105,116,
-121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,
-103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,
-114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108,117,101, 41, 10,123, 10,  9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,
-101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,
-105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10,  9,111,117,116,114,103,
- 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,
-105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,
-110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,
-105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,116,
- 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10,  9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,
-116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10,  9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,
-116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,
-101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116,114,103, 98, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10,  9,111,117,
-116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,
-105,108, 41, 59, 10,  9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,
-101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,
-111, 41, 10,123, 10,  9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120,
- 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111,
- 41, 10,123, 10,  9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,
-118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99,
- 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120,
- 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,
-117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10,  9, 99,111,108,111,114, 32, 61, 32,116,
-101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10,  9,118, 97,108,117,101, 32,
- 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,
-116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,
-111,114,109, 97,108, 41, 10,123, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,
-101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 50, 46,
- 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114,
- 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99,
- 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,
- 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41,
- 10,123, 10,  9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10,  9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10,  9,102, 80,
-114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101,
-114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101,
-102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32,
- 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10,  9,109, 97,116, 51,
- 32,109, 51, 59, 10,  9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10,  9,109, 51, 91, 49, 93, 32,
- 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10,  9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59,
- 10,  9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,
-110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99,
- 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119,
- 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52,
- 32,109, 79, 98,106, 73,110,118, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77,
- 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,
-  9,  9,  9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,
-116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32,
- 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10,  9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32,
- 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10,  9,109, 97,116, 51, 32,118,
-105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,
-119, 73,110,118, 41, 59, 10,  9, 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,
-106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 83,105,103,
-109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
- 41, 59, 10,  9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,
-114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10,  9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,
-118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10,  9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44,
- 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10,  9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109,
- 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10,  9, 10,  9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78,
- 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116,
-104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10,  9,118, 82, 49, 32, 61, 32,
-118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,  9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101,
-119, 50,111, 98,106, 59, 10,  9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,  9, 10,  9,102,
-108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101,
-110,103,116,104, 40,118, 78, 41, 59, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32,
- 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,
-110, 41, 59, 10,  9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,
-116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,
-116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,
-117,114,102, 95,110,111,114,109, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9,  9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118,
- 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,
-  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
-111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10,  9,  9,  9,  9,  9,  9,
-  9,  9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97,
- 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 83,105,103,
-109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 78,
- 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,
-114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10,  9, 10,  9,118, 82, 49,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78,
- 32, 41, 32, 41, 59, 10,  9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118,
- 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10,  9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,
-116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10,  9, 10,  9,102,108,111, 97,116, 32,102, 77, 97,103,
-110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61,
- 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77,
- 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10,  9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,
-116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,
-112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44,
- 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,102,108,111, 97,
-116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,
-105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,
-110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,
- 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10,  9,118,101, 99, 51,
- 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101,
- 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,
-118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,
-101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47,
- 10,  9, 10,  9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10,
-  9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10,  9,102,
- 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10,  9, 10,  9,102,
-108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10,  9,118, 78,
- 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101,
- 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10,  9,102, 80,114,101,118, 77, 97,103,
-110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,
-112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10,  9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,
-101,120, 99,111, 46,120,121, 59, 10,  9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43,
- 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10,  9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,
-101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10,  9, 10,  9,102,108,
-111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,
-114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119,
- 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10,  9,
-114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,
-117,108, 32, 41, 59, 10,  9, 10,  9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,
-108,108, 41, 59, 10,  9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, 32,116,
-101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,
-101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111,
- 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10,  9,118,101, 99, 50,
- 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10,  9,118,101, 99, 50, 32, 84,
-101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10,  9,118,101, 99, 50, 32, 83, 84,
- 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10,  9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46,
-120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10,  9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,
-101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10,  9,118,101, 99, 50, 32, 83, 84,
-100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10,  9,118,101,
- 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32,
- 59, 10,  9, 10,  9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10,  9,114,103, 98,116,
-111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10,
-  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,
-108, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,
-114, 41, 44, 32, 72,114, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
- 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101,
- 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10,  9, 10,  9,100, 66,115, 32, 61, 32,104, 83, 99,
- 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10,  9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42,
- 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,
-112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,
-116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,
-118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,
-111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,
-123, 10,  9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42,
- 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 10,  9, 10,  9,118,
- 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59,
- 10,  9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78,
- 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,
-108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100,
- 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82,
- 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111,
- 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99,
- 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
-117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123,
- 10,  9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10,  9,
-118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10,  9,118,
-101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 10,
-  9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,
-105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32,
- 42, 32,118, 82, 49, 32, 43, 32, 10,  9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,103,
-116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,
-120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10,  9,  9,  9,  9, 10,  9,118, 78, 97, 99, 99, 95,111,117,
-116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10,  9,112,101,114,116,117,
-114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116,
- 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97,
-108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
-108, 41, 10,123, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120,
- 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116,
- 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,  9,116, 97,110,103,101,110,116, 32, 61, 32,
-110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,  9,118,101, 99, 51, 32, 66, 32, 61, 32, 99,114,
-111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 41, 59, 10, 10,  9,111,117,116,110,111,114,109, 97,
-108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 32, 43, 32,116,101,120,110,111,114,
+109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10,  9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43,
+ 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
+ 32,102, 97, 99,109, 41, 59, 10, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10,  9,105,110,
+ 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,
+116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
+ 32,102, 97, 99,109, 41, 59, 10, 10,  9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10,  9,105,110, 99,111,108, 32, 61,
+ 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,
+116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
+ 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102,
+ 97, 99,109, 41, 59, 10, 10,  9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97,
+ 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,
+101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,  9,
+109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109,
+ 41, 59, 10, 10,  9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10,  9,  9,105,110, 99,111,108, 32, 61,
+ 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,
+108, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
+ 32,102, 97, 99,109, 41, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,
+102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116,
+ 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97,
+ 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 59, 10,  9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32,
+ 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,
+100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116,
+ 32,102, 97, 99,109, 59, 10,  9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97,
+ 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,  9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 59, 10,  9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32,
+ 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,
+100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,
+116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10,  9,111,117,116,102,
+ 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,102, 97, 99, 41, 10,123, 10,  9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,
+105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41,
+ 10,123, 10,  9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,
+114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10,  9,104, 97,114, 32, 42, 61, 32, 49,
+ 50, 56, 46, 48, 59, 10, 10,  9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49,
+ 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114,
+ 32, 61, 32, 53, 49, 49, 46, 48, 59, 10,  9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,
+111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10,  9, 97,108,112,104, 97, 32, 61, 32,
+ 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108,
+ 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103,
+ 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116,
+ 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,
+123, 10,  9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46,
+ 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10,  9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49,
+ 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,
+110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103,
+ 98, 41, 10,123, 10,  9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,
+105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
+120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,
+108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,
+110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10,
+  9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10,  9,111,117,116,105,110,116,
+101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10,  9,111,117,116,
+115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,
+118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61,
+ 32,114,103, 98, 46, 97, 59, 10,  9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,
+114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10,  9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,
+101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103,
+ 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10,  9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,
+111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,
+122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10,  9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,
+116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,
+101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,
+118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53,
+ 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,
+103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123,
+ 10,  9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,
+121, 41, 59, 10,  9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,
+111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,
+111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10,  9,
+110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,
+111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44,
+ 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,
+115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10,  9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10,  9,118, 78, 97, 99,
+ 99, 32, 61, 32,118, 78, 59, 10,  9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125,
+ 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,
+104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32,
+ 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,
+109, 52, 41, 10,123, 10,  9,109, 97,116, 51, 32,109, 51, 59, 10,  9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,
+121,122, 59, 10,  9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10,  9,109, 51, 91, 50, 93, 32, 61,
+ 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10,  9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,
+114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32,
+ 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52,
+ 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32,102,
+108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97,
+ 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116,
+ 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10,  9,109, 97,116,
+ 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,
+106, 41, 59, 10,  9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,
+106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, 10,  9, 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97,
+ 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
+ 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121,
+ 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,
+122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10,  9,118, 82,
+ 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10,  9,118, 82, 50, 32, 61,
+ 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10,  9,102, 68,101,116, 32, 61, 32,
+100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10,  9, 10,  9, 47, 42, 32,112,114,101,116,
+114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,
+108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100,
+ 32, 42, 47, 10,  9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,  9,118, 82, 50, 32,
+ 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,  9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,
+119, 50,111, 98,106, 59, 10,  9, 10,  9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115,
+ 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32,
+ 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10,  9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,
+117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,
+109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,
+112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9,  9, 32, 32,
+102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78,
+ 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,
+118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
+117,116, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10,  9,
+118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
+ 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
+ 41, 59, 10,  9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109,
+ 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,
+108, 32, 42, 47, 10,  9, 10,  9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,
+118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 10,  9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,
+101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10,  9,102, 68,101,116,
+ 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10,  9, 10,
+  9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10,  9,
+118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,
+100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10,  9,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99,
+ 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10,  9,  9,  9,
+  9,  9,  9,  9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,
+118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118,
+ 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116,
+ 32, 41, 32, 10,123, 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102,
+ 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,
+114,102, 95,112,111,115, 32, 41, 59, 10,  9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32,
+ 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,
+120, 32,110,111,114,109, 97,108, 32, 42, 47, 10,  9, 10,  9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,
+109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10,  9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,
+103,109, 97, 83, 32, 41, 32, 59, 10,  9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,
+118, 82, 49, 32, 41, 59, 10,  9, 10,  9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115,
+ 40,102, 68,101,116, 41, 59, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32,
+ 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41,
+ 59, 10,  9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,
+100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99,
+ 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,
+108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10,  9,118,101,
+ 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10,  9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61,
+ 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10,  9,118,101,
+ 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,
+120,121, 41, 32, 59, 10,  9, 10,  9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10,  9,114,103, 98,
+116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32,
+ 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114,
+ 41, 44, 32, 72,108,114, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59, 10,  9, 10,  9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101,
+ 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10,  9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32,
+ 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116,
+ 97,112, 53, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,
+102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116,
+ 32, 41, 32, 10,123, 10,  9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,
+121, 41, 59, 10,  9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41,
+ 59, 10, 10,  9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10,  9,118,101, 99, 50, 32, 83,
+ 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10,  9,118,
+101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120,
+ 32, 59, 10,  9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32,
+ 84,101,120, 68,121, 32, 59, 10,  9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48,
+ 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10,  9, 10,  9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,
+100, 44, 72,117, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83,
+ 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,
+109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,
+101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10,  9,114,103, 98,116,111, 98,119, 40, 32,116,
+101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10,  9,114,103, 98,116,111,
+ 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10,  9,
+ 10,  9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10,  9,100, 66,116,
+ 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,
+116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51,
+ 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9, 32, 32,111,117,116, 32,
+118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,
+101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10,  9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,
+105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,
+118, 82, 50, 32, 41, 59, 10,  9, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45,
+ 32,118, 83,117,114,102, 71,114, 97,100, 59, 10,  9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,
+114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,
+101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118,
+ 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121,
+ 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,  9,  9,  9,  9,  9,  9,  9, 32, 32, 32,111,117,116, 32,118,
+101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,
+100, 95,110,111,114,109, 32, 41, 32, 10,123, 10,  9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,
+101,120, 99,111, 46,120,121, 41, 59, 10,  9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120,
+ 99,111, 46,120,121, 41, 59, 10, 10,  9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,
+102, 68,101,116, 41, 32, 42, 32, 40, 32, 10,  9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,
+110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42,
+ 84,101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10,  9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32,100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,
+120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10,  9,  9,  9,
+  9, 10,  9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,
+114, 97,100, 59, 10,  9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101,
+ 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,
+116,101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99,
+ 51, 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,
+101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,
+101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,
+  9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109,
+ 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,
+116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,
 109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10,  9,111,
 117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59,
  10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116,
index ba9ef7d..a86431b 100644 (file)
@@ -7,6 +7,6 @@ void main()
        vec4 co = gl_ModelViewMatrix * gl_Vertex;
 
        varposition = co.xyz;
-       varnormal = gl_NormalMatrix * gl_Normal;
+       varnormal = normalize(gl_NormalMatrix * gl_Normal);
        gl_Position = gl_ProjectionMatrix * co;
 
index edf93d8..5d9bd7c 100644 (file)
@@ -1,13 +1,14 @@
 /* DataToC output of file <gpu_shader_vertex_glsl> */
 
-int datatoc_gpu_shader_vertex_glsl_size= 217;
+int datatoc_gpu_shader_vertex_glsl_size= 228;
 char datatoc_gpu_shader_vertex_glsl[]= {
- 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110,
- 59, 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32,
-109, 97,105,110, 40, 41, 10,123, 10,  9,118,101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119,
- 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 86,101,114,116,101,120, 59, 10, 10,  9,118, 97,114,112,111,115,105,116,105,111,
-110, 32, 61, 32, 99,111, 46,120,121,122, 59, 10,  9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,103,108, 95, 78,111,114,109,
- 97,108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 59, 10,  9,103,108, 95, 80,111,115,105,116,105,
+ 10,118, 97,114,
+121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110, 59, 10,118, 97,114,121,105,110,103, 32,118,
+101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32,109, 97,105,110, 40, 41, 10,123, 10,  9,118,
+101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 32, 42, 32,103,108,
+ 95, 86,101,114,116,101,120, 59, 10, 10,  9,118, 97,114,112,111,115,105,116,105,111,110, 32, 61, 32, 99,111, 46,120,121,122, 59,
+ 10,  9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,103,108, 95, 78,111,114,109, 97,
+108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 41, 59, 10,  9,103,108, 95, 80,111,115,105,116,105,
 111,110, 32, 61, 32,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 32, 42, 32, 99,111, 59, 10, 10,
   0};
 
index 2b45181..7825d2e 100644 (file)
@@ -136,7 +136,7 @@ typedef struct ShadeInput
        /* texture coordinates */
        float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4];
        float refcol[4], displace[3];
-       float strandco, tang[3], nmaptang[3], stress, winspeed[4];
+       float strandco, tang[3], nmapnorm[3], nmaptang[4], stress, winspeed[4];
        float duplilo[3], dupliuv[3];
 
        ShadeInputUV uv[8];   /* 8 = MAX_MTFACE */
index 72bec0c..b4e6d4a 100644 (file)
@@ -494,11 +494,82 @@ static void calc_tangent_vector(ObjectRen *obr, VertexTangent **vtangents, MemAr
 }
 
 
+typedef struct
+{
+       ObjectRen *obr;
+
+} SRenderMeshToTangent;
+
+// interface
+#include "mikktspace.h"
+
+static int GetNumFaces(const SMikkTSpaceContext * pContext)
+{
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       return pMesh->obr->totvlak;
+}
+
+static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num)
+{
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+       return vlr->v4!=NULL ? 4 : 3;
+}
+
+static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+       VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+       VECCOPY(fPos, pVerts[vert_index]->co);
+}
+
+static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+       MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->obr->actmtface, NULL, 0);
+       
+       if(tface!=NULL)
+       {
+               float * pTexCo = tface->uv[vert_index];
+               fUV[0]=pTexCo[0]; fUV[1]=pTexCo[1];
+       }
+       else
+       {
+               VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+               map_to_sphere(&fUV[0], &fUV[1], pVerts[vert_index]->orco[0], pVerts[vert_index]->orco[1], pVerts[vert_index]->orco[2]);
+       }
+}
+
+static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+       VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+       VECCOPY(fNorm, pVerts[vert_index]->n);
+}
+static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
+{
+       //assert(vert_index>=0 && vert_index<4);
+       SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+       VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+       float * ftang= RE_vlakren_get_nmap_tangent(pMesh->obr, vlr, 1);
+       if(ftang!=NULL)
+       {
+               VECCOPY(&ftang[iVert*4+0], fvTangent);
+               ftang[iVert*4+3]=fSign;
+       }
+}
+
 static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
 {
        MemArena *arena= NULL;
        VertexTangent **vtangents= NULL;
-       int a;
+       int a, iCalcNewMethod;
 
        if(do_nmap_tangent) {
                arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "nmap tangent arena");
@@ -594,22 +665,24 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
                        MTFace *tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
 
                        if(tface) {
+                               int k=0;
                                float *vtang, *ftang= RE_vlakren_get_nmap_tangent(obr, vlr, 1);
 
                                vtang= find_vertex_tangent(vtangents[v1->index], tface->uv[0]);
                                VECCOPY(ftang, vtang);
                                normalize_v3(ftang);
                                vtang= find_vertex_tangent(vtangents[v2->index], tface->uv[1]);
-                               VECCOPY(ftang+3, vtang);
-                               normalize_v3(ftang+3);
+                               VECCOPY(ftang+4, vtang);
+                               normalize_v3(ftang+4);
                                vtang= find_vertex_tangent(vtangents[v3->index], tface->uv[2]);
-                               VECCOPY(ftang+6, vtang);
-                               normalize_v3(ftang+6);
+                               VECCOPY(ftang+8, vtang);
+                               normalize_v3(ftang+8);
                                if(v4) {
                                        vtang= find_vertex_tangent(vtangents[v4->index], tface->uv[3]);
-                                       VECCOPY(ftang+9, vtang);
-                                       normalize_v3(ftang+9);
+                                       VECCOPY(ftang+12, vtang);
+                                       normalize_v3(ftang+12);
                                }
+                               for(k=0; k<4; k++) ftang[4*k+3]=1;
                        }
                }
        }
@@ -631,6 +704,31 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
                }
        }
 
+       iCalcNewMethod = 1;
+       if(iCalcNewMethod!=0 && do_nmap_tangent!=0)
+       {
+               SRenderMeshToTangent mesh2tangent;
+               SMikkTSpaceContext sContext;
+               SMikkTSpaceInterface sInterface;
+               memset(&mesh2tangent, 0, sizeof(SRenderMeshToTangent));
+               memset(&sContext, 0, sizeof(SMikkTSpaceContext));
+               memset(&sInterface, 0, sizeof(SMikkTSpaceInterface));
+
+               mesh2tangent.obr = obr;
+
+               sContext.m_pUserData = &mesh2tangent;
+               sContext.m_pInterface = &sInterface;
+               sInterface.m_getNumFaces = GetNumFaces;
+               sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace;
+               sInterface.m_getPosition = GetPosition;
+               sInterface.m_getTexCoord = GetTextureCoordinate;
+               sInterface.m_getNormal = GetNormal;
+               sInterface.m_setTSpaceBasic = SetTSpace;
+
+               // 0 if failed
+               iCalcNewMethod = genTangSpaceDefault(&sContext);
+       }
+
 
        if(arena)
                BLI_memarena_free(arena);
index 62e684e..0da1070 100644 (file)
@@ -2114,6 +2114,7 @@ void do_material_tex(ShadeInput *shi)
        float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
        int tex_nr, rgbnor= 0, warpdone=0;
        int use_compat_bump, use_ntap_bump;
+       int iFirstTimeNMap=1;
 
        compatible_bump_init(&compat_bump);
        ntap_bump_init(&ntap_bump);
@@ -2427,14 +2428,17 @@ void do_material_tex(ShadeInput *shi)
                                                if(mtex->normapspace == MTEX_NSPACE_TANGENT) {
                                                        /* qdn: tangent space */
                                                        float B[3], tv[3];
-                                                       cross_v3_v3v3(B, shi->vn, shi->nmaptang);       /* bitangent */
+                                                       const float * no = iFirstTimeNMap!=0 ? shi->nmapnorm : shi->vn;
+                                                       iFirstTimeNMap=0;
+                                                       cross_v3_v3v3(B, no, shi->nmaptang);    /* bitangent */
+                                                       mul_v3_fl(B, shi->nmaptang[3]);
                                                        /* transform norvec from tangent space to object surface in camera space */
-                                                       tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*shi->vn[0];
-                                                       tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*shi->vn[1];
-                                                       tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*shi->vn[2];
-                                                       shi->vn[0]= facm*shi->vn[0] + fact*tv[0];
-                                                       shi->vn[1]= facm*shi->vn[1] + fact*tv[1];
-                                                       shi->vn[2]= facm*shi->vn[2] + fact*tv[2];
+                                                       tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*no[0];
+                                                       tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*no[1];
+                                                       tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*no[2];
+                                                       shi->vn[0]= facm*no[0] + fact*tv[0];
+                                                       shi->vn[1]= facm*no[1] + fact*tv[1];
+                                                       shi->vn[2]= facm*no[2] + fact*tv[2];
                                                }
                                                else {
                                                        float nor[3];
index fac2e39..5d2002e 100644 (file)
@@ -2160,12 +2160,14 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
                                if(tvn && ttang) {
                                        VECCOPY(mat[0], ttang);
                                        cross_v3_v3v3(mat[1], tvn, ttang);
+                                       mul_v3_fl(mat[1], ttang[3]);
                                        VECCOPY(mat[2], tvn);
                                }
                                else {
                                        VECCOPY(mat[0], shi->nmaptang);
-                                       cross_v3_v3v3(mat[1], shi->vn, shi->nmaptang);
-                                       VECCOPY(mat[2], shi->vn);
+                                       cross_v3_v3v3(mat[1], shi->nmapnorm, shi->nmaptang);
+                                       mul_v3_fl(mat[1], shi->nmaptang[3]);
+                                       VECCOPY(mat[2], shi->nmapnorm);
                                }
 
                                invert_m3_m3(imat, mat);
@@ -2347,7 +2349,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
        VlakRen *vlr= bs->vlr;
        ObjectInstanceRen *obi= bs->obi;
        Object *ob= obi->obr->ob;
-       float l, *v1, *v2, *v3, tvn[3], ttang[3];
+       float l, *v1, *v2, *v3, tvn[3], ttang[4];
        int quad;
        ShadeSample *ssamp= &bs->ssamp;
        ShadeInput *shi= ssamp->shi;
@@ -2386,8 +2388,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
 
        if(bs->type==RE_BAKE_NORMALS && R.r.bake_normal_space==R_BAKE_SPACE_TANGENT) {
                shade_input_set_shade_texco(shi);
-               VECCOPY(tvn, shi->vn);
-               VECCOPY(ttang, shi->nmaptang);
+               VECCOPY(tvn, shi->nmapnorm);
+               QUATCOPY(ttang, shi->nmaptang);
        }
 
        /* if we are doing selected to active baking, find point on other face */
index c1a3b98..036fb85 100644 (file)
 #define RE_RADFACE_ELEMS       1
 #define RE_SIMPLIFY_ELEMS      2
 #define RE_FACE_ELEMS          1
-#define RE_NMAP_TANGENT_ELEMS  12
+#define RE_NMAP_TANGENT_ELEMS  16
 
 float *RE_vertren_get_sticky(ObjectRen *obr, VertRen *ver, int verify)
 {
index 88dc13d..38ed5a0 100644 (file)
@@ -286,9 +286,9 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
                VECCOPY(shi->n3, shi->v3->n);
 
                if(obi->flag & R_TRANSFORMED) {
-                       mul_m3_v3(obi->nmat, shi->n1);
-                       mul_m3_v3(obi->nmat, shi->n2);
-                       mul_m3_v3(obi->nmat, shi->n3);
+                       mul_m3_v3(obi->nmat, shi->n1); normalize_v3(shi->n1);
+                       mul_m3_v3(obi->nmat, shi->n2); normalize_v3(shi->n2);
+                       mul_m3_v3(obi->nmat, shi->n3); normalize_v3(shi->n3);
                }
        }
 }
@@ -819,11 +819,17 @@ void shade_input_set_normals(ShadeInput *shi)
                shi->vn[0]= l*n3[0]-u*n1[0]-v*n2[0];
                shi->vn[1]= l*n3[1]-u*n1[1]-v*n2[1];
                shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2];
+
+               // use unnormalized normal (closer to games)
+               VECCOPY(shi->nmapnorm, shi->vn);
                
                normalize_v3(shi->vn);
        }
        else
+       {
                VECCOPY(shi->vn, shi->facenor);
+               VECCOPY(shi->nmapnorm, shi->vn);
+       }
        
        /* used in nodes */
        VECCOPY(shi->vno, shi->vn);
@@ -849,6 +855,10 @@ void shade_input_flip_normals(ShadeInput *shi)
        shi->vno[1]= -shi->vno[1];
        shi->vno[2]= -shi->vno[2];
 
+       shi->nmapnorm[0] = -shi->nmapnorm[0];
+       shi->nmapnorm[1] = -shi->nmapnorm[1];
+       shi->nmapnorm[2] = -shi->nmapnorm[2];
+
        shi->flippednor= !shi->flippednor;
 }
 
@@ -924,21 +934,32 @@ void shade_input_set_shade_texco(ShadeInput *shi)
 
                        if(tangent) {
                                int j1= shi->i1, j2= shi->i2, j3= shi->i3;
+                               float c0[3], c1[3], c2[3];
 
                                vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
 
-                               s1= &tangent[j1*3];
-                               s2= &tangent[j2*3];
-                               s3= &tangent[j3*3];
-
-                               shi->nmaptang[0]= (tl*s3[0] - tu*s1[0] - tv*s2[0]);
-                               shi->nmaptang[1]= (tl*s3[1] - tu*s1[1] - tv*s2[1]);
-                               shi->nmaptang[2]= (tl*s3[2] - tu*s1[2] - tv*s2[2]);
+                               VECCOPY(c0, &tangent[j1*4]);
+                               VECCOPY(c1, &tangent[j2*4]);
+                               VECCOPY(c2, &tangent[j3*4]);
 
+                               // keeping tangents normalized at vertex level
+                               // corresponds better to how it's done in game engines
                                if(obi->flag & R_TRANSFORMED)
-                                       mul_m3_v3(obi->nmat, shi->nmaptang);
-
-                               normalize_v3(shi->nmaptang);
+                               {
+                                       mul_mat3_m4_v3(obi->mat, c0); normalize_v3(c0);
+                                       mul_mat3_m4_v3(obi->mat, c1); normalize_v3(c1);
+                                       mul_mat3_m4_v3(obi->mat, c2); normalize_v3(c2);
+                               }
+                               
+                               // we don't normalize the interpolated TBN tangent
+                               // corresponds better to how it's done in game engines
+                               shi->nmaptang[0]= (tl*c2[0] - tu*c0[0] - tv*c1[0]);
+                               shi->nmaptang[1]= (tl*c2[1] - tu*c0[1] - tv*c1[1]);
+                               shi->nmaptang[2]= (tl*c2[2] - tu*c0[2] - tv*c1[2]);
+
+                               // the sign is the same for all 3 vertices of any
+                               // non degenerate triangle.
+                               shi->nmaptang[3]= tangent[j1*4+3];
                        }
                }
        }