Merged changes in the trunk up to revision 43881.
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 4 Feb 2012 14:22:05 +0000 (14:22 +0000)
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 4 Feb 2012 14:22:05 +0000 (14:22 +0000)
122 files changed:
CMakeLists.txt
build_files/cmake/cmake_static_check_cppcheck.py
doc/blender_file_format/BlendFileDnaExporter_25.py
doc/blender_file_format/BlendFileReader.py
doc/python_api/rst/bge.logic.rst
doc/python_api/rst/info_quickstart.rst
extern/carve/bundle.sh
extern/carve/lib/intersect_face_division.cpp
extern/carve/lib/triangulator.cpp
intern/boolop/intern/BOP_CarveInterface.cpp
intern/cycles/app/io_export_cycles_xml.py
intern/cycles/blender/addon/ui.py
intern/cycles/kernel/kernel_emission.h
intern/cycles/kernel/kernel_path.h
intern/cycles/kernel/kernel_shader.h
intern/memutil/MEM_CacheLimiter.h
intern/memutil/MEM_CacheLimiterC-Api.h
intern/memutil/intern/MEM_CacheLimiterC-Api.cpp
release/scripts/modules/bpy_extras/object_utils.py
release/scripts/startup/bl_operators/clip.py
release/scripts/startup/bl_operators/object.py
release/scripts/startup/bl_ui/properties_data_curve.py
release/scripts/startup/bl_ui/properties_data_mesh.py
release/scripts/startup/bl_ui/properties_data_modifier.py
release/scripts/startup/bl_ui/properties_object_constraint.py
release/scripts/startup/bl_ui/properties_physics_fluid.py
release/scripts/startup/bl_ui/space_clip.py
release/scripts/startup/bl_ui/space_image.py
release/scripts/startup/bl_ui/space_node.py
source/blender/blenfont/BLF_api.h
source/blender/blenfont/CMakeLists.txt
source/blender/blenfont/SConscript
source/blender/blenfont/intern/blf_glyph.c
source/blender/blenkernel/BKE_anim.h
source/blender/blenkernel/BKE_armature.h
source/blender/blenkernel/BKE_lattice.h
source/blender/blenkernel/BKE_movieclip.h
source/blender/blenkernel/BKE_texture.h
source/blender/blenkernel/intern/anim.c
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/cloth.c
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/context.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/fcurve.c
source/blender/blenkernel/intern/lattice.c
source/blender/blenkernel/intern/movieclip.c
source/blender/blenkernel/intern/navmesh_conversion.c
source/blender/blenkernel/intern/seqeffects.c
source/blender/blenkernel/intern/sequencer.c
source/blender/blenkernel/intern/texture.c
source/blender/blenkernel/intern/tracking.c
source/blender/blenlib/intern/bpath.c
source/blender/blenlib/intern/math_color.c
source/blender/blenloader/intern/readfile.c
source/blender/collada/GeometryExporter.cpp
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/animation/anim_deps.c
source/blender/editors/include/ED_view3d.h
source/blender/editors/interface/interface_draw.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/mesh/editmesh_loop.c
source/blender/editors/mesh/mesh_data.c
source/blender/editors/object/object_bake.c
source/blender/editors/object/object_modifier.c
source/blender/editors/physics/physics_fluid.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/editors/space_buttons/buttons_ops.c
source/blender/editors/space_clip/clip_graph_ops.c
source/blender/editors/space_clip/clip_ops.c
source/blender/editors/space_clip/tracking_ops.c
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_sequencer/sequencer_draw.c
source/blender/editors/space_sequencer/sequencer_scopes.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_conversions.c
source/blender/gpu/intern/gpu_shader_material.glsl
source/blender/gpu/intern/gpu_shader_material.glsl.c
source/blender/imbuf/intern/moviecache.c
source/blender/makesdna/DNA_curve_types.h
source/blender/makesdna/DNA_movieclip_types.h
source/blender/makesdna/DNA_object_fluidsim.h
source/blender/makesrna/intern/rna_constraint.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_fluidsim.c
source/blender/makesrna/intern/rna_key.c
source/blender/makesrna/intern/rna_material.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_movieclip.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm.c
source/blender/modifiers/intern/MOD_boolean.c
source/blender/modifiers/intern/MOD_cloth.c
source/blender/modifiers/intern/MOD_curve.c
source/blender/modifiers/intern/MOD_fluidsim_util.c
source/blender/modifiers/intern/MOD_meshdeform.c
source/blender/nodes/composite/node_composite_tree.c
source/blender/python/intern/bpy_rna.c
source/blender/python/mathutils/mathutils_Matrix.c
source/blender/python/mathutils/mathutils_Vector.c
source/blender/python/rna_dump.py
source/blender/render/intern/source/occlusion.c
source/blender/render/intern/source/pipeline.c
source/blender/render/intern/source/shadeoutput.c
source/blender/render/intern/source/zbuf.c
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/intern/wm_files.c
source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
source/gameengine/Ketsji/KX_NavMeshObject.cpp
source/gameengine/Ketsji/KX_PythonInit.cpp
source/tests/bl_mesh_modifiers.py
source/tests/bl_run_operators.py

index fb6b946b0c6620248dfb39c221c91cb5eb1aceb5..47d40bb48c28d19952483fa596137bfbf288583e 100644 (file)
@@ -249,6 +249,12 @@ if(APPLE)
                "Choose the minimum OSX version required: 10.4 or 10.5"
                FORCE)
        endif()
+       if(${CMAKE_GENERATOR} MATCHES "Xcode" AND (${XCODE_VERSION} VERSION_EQUAL 4 OR ${XCODE_VERSION} VERSION_GREATER 4))
+               # Xcode 4 defaults to the Apple LLVM Compiler.
+               # Override the default compiler selection because Blender only compiles with gcc
+               set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvmgcc42")
+               message(STATUS "Setting compiler to: " ${CMAKE_XCODE_ATTRIBUTE_GCC_VERSION})
+       endif()
        option(WITH_COCOA         "Use Cocoa framework instead of deprecated Carbon" ON)
        option(USE_QTKIT          "Use QtKit instead of Carbon quicktime (needed for having partial quicktime for 64bit)" OFF)
        option(WITH_LIBS10.5  "Use 10.5 libs (needed for 64bit builds)" OFF)
index 6c13f3a079a12826d46a01a86468be393b71ef45..436470a702064dec862ffc3e1673099f1999186e 100644 (file)
@@ -37,7 +37,7 @@ CHECKER_BIN = "cppcheck"
 CHECKER_ARGS = [
     # not sure why this is needed, but it is.
     "-I" + os.path.join(project_source_info.SOURCE_DIR, "extern", "glew", "include"),
-       "--suppress=*:%s/extern/glew/include/GL/glew.h:241" % project_source_info.SOURCE_DIR,
+    "--suppress=*:%s/extern/glew/include/GL/glew.h:241" % project_source_info.SOURCE_DIR,
     # "--max-configs=1",  # speeds up execution
     #  "--check-config", # when includes are missing
     #  "--enable=all",  # if you want sixty hundred pedantic suggestions
index bc5b2e73c7e8681e0938c532de4c9f002f971e29..a201f618fbb0c1bc90f95dce0b4a25dcbff3af5a 100755 (executable)
@@ -206,13 +206,13 @@ class DNACatalogHTML:
                 <td>${size}</td>
             </tr>"""
         
-        if field.Type.Structure == None or field.Name.IsPointer():
+        if field.Type.Structure is None or field.Name.IsPointer():
 
             # ${reference}
             reference = field.Name.AsReference(parentReference)
 
             # ${struct}
-            if parentReference != None:
+            if parentReference is not None:
                 struct = '<a href="#{0}">{0}</a>'.format(structure.Type.Name)
             else:
                 struct = structure.Type.Name
@@ -240,7 +240,7 @@ class DNACatalogHTML:
             
             structure_field = Template(structure_field_template).substitute(d)
         
-        elif field.Type.Structure != None:
+        elif field.Type.Structure is not None:
             reference = field.Name.AsReference(parentReference)
             structure_field = self.StructureFields(field.Type.Structure, reference, offset) 
 
index 313c8c7ff5dfb26cb215279a24d9634ccb51db13..88eb71b3ce250482400cabce80d3fa82391ad325 100644 (file)
@@ -329,7 +329,7 @@ class DNAName:
         self.Name = name
         
     def AsReference(self, parent):
-        if parent == None:
+        if parent is None:
             result = ""
         else:
             result = parent+"."
index 82e699658407a4aafd42b9da78efd26a8393cb75..d071984b14b7da0e4bfafc60d371f848839cd6f9 100644 (file)
@@ -69,11 +69,9 @@ See the actuator's reference for available methods
    :columns: 3
    
    * :class:`~bge.types.BL_ActionActuator`
-   * :class:`~bge.types.BL_ShapeActionActuator`
    * :class:`~bge.types.KX_CameraActuator`
    * :class:`~bge.types.KX_ConstraintActuator`
    * :class:`~bge.types.KX_GameActuator`
-   * :class:`~bge.types.KX_IpoActuator`
    * :class:`~bge.types.KX_NetworkMessageActuator`
    * :class:`~bge.types.KX_ObjectActuator`
    * :class:`~bge.types.KX_ParentActuator`
@@ -477,6 +475,7 @@ Action Actuator
 See :class:`bge.types.BL_ActionActuator`
 
 .. data:: KX_ACTIONACT_PLAY
+.. data:: KX_ACTIONACT_PINGPONG
 .. data:: KX_ACTIONACT_FLIPPER
 .. data:: KX_ACTIONACT_LOOPSTOP
 .. data:: KX_ACTIONACT_LOOPEND
@@ -635,21 +634,6 @@ See :class:`bge.types.KX_GameActuator`
 .. data:: KX_GAME_SAVECFG
 .. data:: KX_GAME_LOADCFG
 
-.. _ipo-actuator:
-
-------------
-IPO Actuator
-------------
-
-See :class:`bge.types.KX_IpoActuator`
-
-.. data:: KX_IPOACT_PLAY
-.. data:: KX_IPOACT_PINGPONG
-.. data:: KX_IPOACT_FLIPPER
-.. data:: KX_IPOACT_LOOPSTOP
-.. data:: KX_IPOACT_LOOPEND
-.. data:: KX_IPOACT_FROM_PROP
-
 ---------------
 Parent Actuator
 ---------------
@@ -691,20 +675,6 @@ See :class:`bge.types.KX_SceneActuator`
 .. data:: KX_SCENE_SUSPEND
 .. data:: KX_SCENE_RESUME
 
-.. _shape-action-actuator:
-
----------------------
-Shape Action Actuator
----------------------
-
-See :class:`bge.types.BL_ActionActuator`
-
-.. data:: KX_ACTIONACT_PLAY
-.. data:: KX_ACTIONACT_FLIPPER
-.. data:: KX_ACTIONACT_LOOPSTOP
-.. data:: KX_ACTIONACT_LOOPEND
-.. data:: KX_ACTIONACT_PROPERTY
-
 .. _logic-sound-actuator:
 
 --------------
index b37b75587709b11f890d25fec5c2eac822d3a56a..19ec8059acaebdd749db2eff3bb5f0b755eff19f 100644 (file)
@@ -123,6 +123,29 @@ Example of a data path that can be quickly found via the console:
    1.0
 
 
+Data Creation/Removal
+^^^^^^^^^^^^^^^^^^^^^
+
+Those of you familiar with other python api's may be surprised that new datablocks in the bpy api can't be created by calling the class:
+
+   >>> bpy.types.Mesh()
+   Traceback (most recent call last):
+     File "<blender_console>", line 1, in <module>
+   TypeError: bpy_struct.__new__(type): expected a single argument
+
+
+This is an intentional part of the API design.
+The blender/python api can't create blender data that exists outside the main blender database (accessed through bpy.data), because this data is managed by blender (save/load/undo/append... etc).
+
+Data is added and removed via methods on the collections in bpy.data, eg:
+
+   >>> mesh = bpy.data.meshes.new(name="MyMesh")
+   >>> print(mesh)
+   <bpy_struct, Mesh("MyMesh.001")>
+
+   >>> bpy.data.meshes.remove(mesh)
+
+
 Custom Properties
 ^^^^^^^^^^^^^^^^^
 
index 3f9028619a53892ff314116ca92d61023f73c34e..bc719ae5ba8a80795d2ee58dfb68c90914b9d0cf 100755 (executable)
@@ -17,7 +17,7 @@ done
 rm -rf include
 rm -rf lib
 
-cat "files.txt" | while f=`line`; do
+cat "files.txt" | while read f; do
   mkdir -p `dirname $f`
   cp $tmp/carve/$f $f
 done
index 6f2aa65ed67539cb37d39093aa8f024c28980239..08550c021ad6b5efb66c115c34dfc12da3524274 100644 (file)
@@ -48,6 +48,63 @@ namespace {
 
 
 
+#if defined(CARVE_DEBUG_WRITE_PLY_DATA)
+  template<typename iter_t>
+  void dumpFacesAndHoles(iter_t f_begin, iter_t f_end,
+                         iter_t h_begin, iter_t h_end,
+                         const std::string &fname) {
+    std::cerr << "dumping " << std::distance(f_begin, f_end) << " faces, " << std::distance(h_begin, h_end) << " holes." << std::endl;
+    std::map<carve::mesh::MeshSet<3>::vertex_t *, size_t> v_included;
+
+    for (iter_t i = f_begin; i != f_end; ++i) {
+      for (size_t j = 0; j < (*i).size(); ++j) {
+        if (v_included.find((*i)[j]) == v_included.end()) {
+          size_t &p = v_included[(*i)[j]];
+          p = v_included.size() - 1;
+        }
+      }
+    }
+
+    for (iter_t i = h_begin; i != h_end; ++i) {
+      for (size_t j = 0; j < (*i).size(); ++j) {
+        if (v_included.find((*i)[j]) == v_included.end()) {
+          size_t &p = v_included[(*i)[j]];
+          p = v_included.size() - 1;
+        }
+      }
+    }
+
+    carve::line::PolylineSet fh;
+    fh.vertices.resize(v_included.size());
+    for (std::map<carve::mesh::MeshSet<3>::vertex_t *, size_t>::const_iterator
+           i = v_included.begin(); i != v_included.end(); ++i) {
+      fh.vertices[(*i).second].v = (*i).first->v;
+    }
+
+    {
+      std::vector<size_t> connected;
+      for (iter_t i = f_begin; i != f_end; ++i) {
+        connected.clear();
+        for (size_t j = 0; j < (*i).size(); ++j) {
+          connected.push_back(v_included[(*i)[j]]);
+        }
+        fh.addPolyline(true, connected.begin(), connected.end());
+      }
+      for (iter_t i = h_begin; i != h_end; ++i) {
+        connected.clear();
+        for (size_t j = 0; j < (*i).size(); ++j) {
+          connected.push_back(v_included[(*i)[j]]);
+        }
+        fh.addPolyline(true, connected.begin(), connected.end());
+      }
+    }
+
+    ::writePLY(fname, &fh, true);
+  }
+#endif
+
+
+
   template<typename T>
   void populateVectorFromList(std::list<T> &l, std::vector<T> &v) {
     v.clear();
@@ -433,6 +490,7 @@ namespace {
         face_loops_sorted[m].push_back(n);
       }
       face_loop_areas.push_back(carve::geom2d::signedArea(face_loops_projected[m]));
+
       std::sort(face_loops_sorted[m].begin(), face_loops_sorted[m].end(), 
                 carve::make_index_sort(face_loops[m].begin()));
       face_loop_aabb[m].fit(face_loops_projected[m].begin(), face_loops_projected[m].end());
@@ -449,6 +507,7 @@ namespace {
         hole_loops_sorted[m].push_back(n);
       }
       hole_loop_areas.push_back(carve::geom2d::signedArea(hole_loops_projected[m]));
+
       std::sort(hole_loops_sorted[m].begin(), hole_loops_sorted[m].end(), 
                 carve::make_index_sort(hole_loops[m].begin()));
       hole_loop_aabb[m].fit(hole_loops_projected[m].begin(), hole_loops_projected[m].end());
@@ -572,6 +631,10 @@ namespace {
     std::vector<std::vector<int> > containing_faces;
     std::map<int, std::map<int, std::pair<unsigned, unsigned> > > hole_shared_vertices;
 
+#if defined(CARVE_DEBUG_WRITE_PLY_DATA)
+    dumpFacesAndHoles(f_loops.begin(), f_loops.end(), h_loops.begin(), h_loops.end(), "/tmp/pre_merge.ply");
+#endif
+
     {
       // move input face and hole loops to temp vectors.
       size_t m;
@@ -720,6 +783,10 @@ namespace {
       }
     }
 #endif
+#if defined(CARVE_DEBUG_WRITE_PLY_DATA)
+    dumpFacesAndHoles(f_loops.begin(), f_loops.end(), h_loops.begin(), h_loops.end(), "/tmp/post_merge.ply");
+#endif
+
   }
 
 
@@ -738,7 +805,7 @@ namespace {
    *            on that edge.
    * @param[out] base_loop A vector of the vertices of the base loop.
    */
-  static void assembleBaseLoop(carve::mesh::MeshSet<3>::face_t *face,
+  static bool assembleBaseLoop(carve::mesh::MeshSet<3>::face_t *face,
                                const carve::csg::detail::Data &data,
                                std::vector<carve::mesh::MeshSet<3>::vertex_t *> &base_loop) {
     base_loop.clear();
@@ -746,6 +813,7 @@ namespace {
     // XXX: assumes that face->edges is in the same order as
     // face->vertices. (Which it is)
     carve::mesh::MeshSet<3>::edge_t *e = face->edge;
+    bool face_edge_intersected = false;
     do {
       base_loop.push_back(carve::csg::map_vertex(data.vmap, e->vert));
 
@@ -757,9 +825,13 @@ namespace {
         for (size_t k = 0, ke = ev_vec.size(); k < ke;) {
           base_loop.push_back(ev_vec[k++]);
         }
+
+        face_edge_intersected = true;
       }
       e = e->next;
     } while (e != face->edge);
+
+    return face_edge_intersected;
   }
 
 
@@ -789,7 +861,6 @@ namespace {
                             carve::csg::CSG::Hooks &hooks,
                             std::vector<carve::mesh::MeshSet<3>::vertex_t *> &base_loop,
                             std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &paths,
-                            std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &loops,
                             std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &face_loops_out) {
     const size_t N = base_loop.size();
     std::vector<crossing_data> endpoint_indices;
@@ -800,6 +871,7 @@ namespace {
       endpoint_indices.push_back(crossing_data(&paths[i], N, N));
     }
 
+    // Step 1:
     // locate endpoints of paths on the base loop.
     for (size_t i = 0; i < N; ++i) {
       for (size_t j = 0; j < paths.size(); ++j) {
@@ -872,6 +944,7 @@ namespace {
 #endif
 
 
+    // Step 2:
     // divide paths up into those that connect to the base loop in two
     // places (cross), and those that do not (noncross).
     std::vector<crossing_data> cross, noncross;
@@ -895,7 +968,6 @@ namespace {
           double area = carve::geom2d::signedArea(endpoint_indices[i].path->begin() + 1,
                                                   endpoint_indices[i].path->end(),
                                                   carve::mesh::MeshSet<3>::face_t::projection_mapping(face->project));
-          std::cerr << "HITS THIS CODE - area=" << area << std::endl;
           if (area < 0) {
             // XXX: Create test case to check that this is the correct sign for the area.
             std::reverse(endpoint_indices[i].path->begin(), endpoint_indices[i].path->end());
@@ -917,6 +989,7 @@ namespace {
       }
     }
 
+    // Step 3:
     // add a temporary crossing path that connects the beginning and the
     // end of the base loop. this stops us from needing special case
     // code to handle the left over loop after all the other crossing
@@ -931,10 +1004,12 @@ namespace {
     std::cerr << "### crossing edge count (with sentinel): " << cross.size() << std::endl;
 #endif
 
+    // Step 4:
     // sort paths by increasing beginning point and decreasing ending point.
     std::sort(cross.begin(), cross.end());
     std::sort(noncross.begin(), noncross.end());
 
+    // Step 5:
     // divide up the base loop based upon crossing paths.
     std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > divided_base_loop;
     divided_base_loop.reserve(cross.size());
@@ -979,6 +1054,7 @@ namespace {
       }
     }
 
+    // Step 6:
     for (size_t i = 0; i < cross.size(); ++i) {
 #if defined(CARVE_DEBUG)
       std::cerr << "### i=" << i << " working on edge: " << cross[i].edge_idx[0] << " - " << cross[i].edge_idx[1] << std::endl;
@@ -1060,7 +1136,8 @@ namespace {
 #endif
     }
 
-    if (!noncross.size() && !loops.size()) {
+    if (!noncross.size()) {
+      // If there are no non-crossing paths then we're done.
       populateListFromVector(divided_base_loop, face_loops_out);
       return true;
     }
@@ -1113,16 +1190,6 @@ namespace {
         }
       }
 
-      // for each loop, just test with any point.
-      for (size_t j = 0; j < loops.size(); ++j) {
-        test = face->project(loops[j].front()->v);
-
-        if (proj_aabb[i].intersects(test) &&
-            carve::geom2d::pointInPoly(proj[i], test).iclass != carve::POINT_OUT) {
-          inc.push_back(&loops[j]);
-        }
-      }
-
 #if defined(CARVE_DEBUG)
       std::cerr << "### divided base loop:" << i << " inc.size()=" << inc.size() << std::endl;
       std::cerr << "### inc = [";
@@ -1172,15 +1239,18 @@ namespace {
   void composeEdgesIntoPaths(const carve::csg::V2Set &edges,
                              const std::vector<carve::mesh::MeshSet<3>::vertex_t *> &extra_endpoints,
                              std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &paths,
+                             std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &cuts,
                              std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &loops) {
     using namespace carve::csg;
 
     detail::VVSMap vertex_graph;
     detail::VSet endpoints;
+    detail::VSet cut_endpoints;
 
-    std::vector<carve::mesh::MeshSet<3>::vertex_t *> path;
+    typedef std::vector<carve::mesh::MeshSet<3>::vertex_t *> vvec_t;
+    vvec_t path;
 
-    std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > temp;
+    std::list<vvec_t> path_list, cut_list, loop_list;
 
     // build graph from edges.
     for (V2Set::const_iterator i = edges.begin(); i != edges.end(); ++i) {
@@ -1199,6 +1269,9 @@ namespace {
         std::cerr << "###    endpoint: " << (*i).first << std::endl;
 #endif
         endpoints.insert((*i).first);
+        if ((*i).second.size() == 1) {
+          cut_endpoints.insert((*i).first);
+        }
       }
     }
 
@@ -1209,6 +1282,7 @@ namespace {
         std::cerr << "###    extra endpoint: " << extra_endpoints[i] << std::endl;
 #endif
         endpoints.insert(extra_endpoints[i]);
+        cut_endpoints.erase(extra_endpoints[i]);
       }
     }
 
@@ -1252,11 +1326,19 @@ namespace {
       }
       CARVE_ASSERT(endpoints.find(path.back()) != endpoints.end());
 
-      temp.push_back(path);
+      bool is_cut =
+        cut_endpoints.find(path.front()) != cut_endpoints.end() &&
+        cut_endpoints.find(path.back()) != cut_endpoints.end();
+
+      if (is_cut) {
+        cut_list.push_back(vvec_t()); path.swap(cut_list.back());
+      } else {
+        path_list.push_back(vvec_t()); path.swap(path_list.back());
+      }
     }
 
-    populateVectorFromList(temp, paths);
-    temp.clear();
+    populateVectorFromList(path_list, paths);
+    populateVectorFromList(cut_list, cuts);
 
     // now only loops should remain in the graph.
     while (vertex_graph.size()) {
@@ -1291,69 +1373,11 @@ namespace {
         if (v == path[0]) break;
       }
 
-      temp.push_back(path);
-    }
-    populateVectorFromList(temp, loops);
-  }
-
-
-
-#if defined(CARVE_DEBUG_WRITE_PLY_DATA)
-  void dumpFacesAndHoles(const std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &face_loops,
-                         const std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > &hole_loops) {
-    std::map<carve::mesh::MeshSet<3>::vertex_t *, size_t> v_included;
-
-    for (std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> >::const_iterator
-           i = face_loops.begin(); i != face_loops.end(); ++i) {
-      for (size_t j = 0; j < (*i).size(); ++j) {
-        if (v_included.find((*i)[j]) == v_included.end()) {
-          size_t &p = v_included[(*i)[j]];
-          p = v_included.size() - 1;
-        }
-      }
-    }
-
-    for (std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> >::const_iterator
-           i = hole_loops.begin(); i != hole_loops.end(); ++i) {
-      for (size_t j = 0; j < (*i).size(); ++j) {
-        if (v_included.find((*i)[j]) == v_included.end()) {
-          size_t &p = v_included[(*i)[j]];
-          p = v_included.size() - 1;
-        }
-      }
-    }
-
-    carve::line::PolylineSet fh;
-    fh.vertices.resize(v_included.size());
-    for (std::map<carve::mesh::MeshSet<3>::vertex_t *, size_t>::const_iterator
-           i = v_included.begin(); i != v_included.end(); ++i) {
-      fh.vertices[(*i).second].v = (*i).first->v;
-    }
-
-    {
-      std::vector<size_t> connected;
-      for (std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> >::const_iterator
-             i = face_loops.begin(); i != face_loops.end(); ++i) {
-        connected.clear();
-        for (size_t j = 0; j < (*i).size(); ++j) {
-          connected.push_back(v_included[(*i)[j]]);
-        }
-        fh.addPolyline(true, connected.begin(), connected.end());
-      }
-      for (std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> >::const_iterator
-             i = hole_loops.begin(); i != hole_loops.end(); ++i) {
-        connected.clear();
-        for (size_t j = 0; j < (*i).size(); ++j) {
-          connected.push_back(v_included[(*i)[j]]);
-        }
-        fh.addPolyline(true, connected.begin(), connected.end());
-      }
+      loop_list.push_back(vvec_t()); path.swap(loop_list.back());
     }
-
-    std::string out("/tmp/hole_merge.ply");
-    ::writePLY(out, &fh, true);
+    populateVectorFromList(loop_list, loops);
   }
-#endif
 
 
 
@@ -1416,7 +1440,7 @@ namespace {
     std::vector<carve::mesh::MeshSet<3>::vertex_t *> base_loop;
     std::list<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > hole_loops;
 
-    assembleBaseLoop(face, data, base_loop);
+    bool face_edge_intersected = assembleBaseLoop(face, data, base_loop);
 
     detail::FV2SMap::const_iterator fse_iter = data.face_split_edges.find(face);
 
@@ -1452,7 +1476,8 @@ namespace {
 
       if (face_edges.find(std::make_pair(v1, v2)) == face_edges.end() &&
           face_edges.find(std::make_pair(v2, v1)) == face_edges.end()) {
-
+        // If the edge isn't part of the face perimeter, add it to
+        // split_edges.
         split_edges.insert(ordered_edge(v1, v2));
       }
     }
@@ -1517,9 +1542,13 @@ namespace {
 
         return;
       }
+
+      // Consider handling cases where one end of the edge touches the
+      // perimeter, and where neither end does.
     }
 
     std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > paths;
+    std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > cuts;
     std::vector<std::vector<carve::mesh::MeshSet<3>::vertex_t *> > loops;
 
     // Take the split edges and compose them into a set of paths and
@@ -1528,67 +1557,73 @@ namespace {
     // of the face. Paths are made up of all the other edge segments,
     // and start and end at the face perimeter, or where they meet
     // another path (sometimes both cases will be true).
-    composeEdgesIntoPaths(split_edges, base_loop, paths, loops);
+    composeEdgesIntoPaths(split_edges, base_loop, paths, cuts, loops);
 
 #if defined(CARVE_DEBUG)
     std::cerr << "###   paths.size(): " << paths.size() << std::endl;
+    std::cerr << "###   cuts.size():  " << cuts.size() << std::endl;
     std::cerr << "###   loops.size(): " << loops.size() << std::endl;
 #endif
 
     if (!paths.size()) {
-      // Loops found by composeEdgesIntoPaths() can't touch the
-      // boundary, or each other, so we can deal with the no paths
-      // case simply. The hole loops are the loops produced by
-      // composeEdgesIntoPaths() oriented so that their signed area
-      // wrt. the face is negative. The face loops are the base loop
-      // plus the hole loops, reversed.
+      // No complex paths.
       face_loops.push_back(base_loop);
-
-      for (size_t i = 0; i < loops.size(); ++i) {
-        hole_loops.push_back(std::vector<carve::mesh::MeshSet<3>::vertex_t *>());
-        hole_loops.back().reserve(loops[i].size()-1);
-        std::copy(loops[i].begin(), loops[i].end()-1, std::back_inserter(hole_loops.back()));
-
-        face_loops.push_back(std::vector<carve::mesh::MeshSet<3>::vertex_t *>());
-        face_loops.back().reserve(loops[i].size()-1);
-        std::copy(loops[i].rbegin()+1, loops[i].rend(), std::back_inserter(face_loops.back()));
-
-        std::vector<carve::geom2d::P2> projected;
-        projected.reserve(face_loops.back().size());
-        for (size_t i = 0; i < face_loops.back().size(); ++i) {
-          projected.push_back(face->project(face_loops.back()[i]->v));
-        }
-
-        if (carve::geom2d::signedArea(projected) > 0.0) {
-          std::swap(face_loops.back(), hole_loops.back());
-        }
-      }
-
-      // if there are holes, then they need to be merged with faces.
-      if (hole_loops.size()) {
-        mergeFacesAndHoles(face, face_loops, hole_loops, hooks);
-      }
     } else {
-      if (!processCrossingEdges(face, vertex_intersections, hooks, base_loop, paths, loops, face_loops)) {
+      if (processCrossingEdges(face, vertex_intersections, hooks, base_loop, paths, face_loops)) {
+        // Worked.
+      } else {
         // complex case - fall back to old edge tracing code.
 #if defined(CARVE_DEBUG)
         std::cerr << "### processCrossingEdges failed. Falling back to edge tracing code" << std::endl;
 #endif
-        for (V2Set::const_iterator i = split_edges.begin(); i != split_edges.end(); ++i) {
-          face_edges.insert(std::make_pair((*i).first, (*i).second));
-          face_edges.insert(std::make_pair((*i).second, (*i).first));
+        for (size_t i = 0; i < paths.size(); ++i) {
+          for (size_t j = 0; j < paths[i].size() - 1; ++j) {
+            face_edges.insert(std::make_pair(paths[i][j], paths[i][j+1]));
+            face_edges.insert(std::make_pair(paths[i][j+1], paths[i][j]));
+          }
         }
         splitFace(face, face_edges, face_loops, hole_loops, vertex_intersections);
+      }
+    }
 
-        if (hole_loops.size()) {
-          mergeFacesAndHoles(face, face_loops, hole_loops, hooks);
-        }
+    // Now merge cuts and loops into face loops.
+
+    // every cut creates a hole.
+    for (size_t i = 0; i < cuts.size(); ++i) {
+      hole_loops.push_back(std::vector<carve::mesh::MeshSet<3>::vertex_t *>());
+      hole_loops.back().reserve(2 * cuts[i].size() - 2);
+      std::copy(cuts[i].begin(), cuts[i].end(), std::back_inserter(hole_loops.back()));
+      if (cuts[i].size() > 2) {
+        std::copy(cuts[i].rbegin() + 1, cuts[i].rend() - 1, std::back_inserter(hole_loops.back()));
       }
     }
-  }
 
+    // every loop creates a hole and a corresponding face.
+    for (size_t i = 0; i < loops.size(); ++i) {
+      hole_loops.push_back(std::vector<carve::mesh::MeshSet<3>::vertex_t *>());
+      hole_loops.back().reserve(loops[i].size()-1);
+      std::copy(loops[i].begin(), loops[i].end()-1, std::back_inserter(hole_loops.back()));
 
+      face_loops.push_back(std::vector<carve::mesh::MeshSet<3>::vertex_t *>());
+      face_loops.back().reserve(loops[i].size()-1);
+      std::copy(loops[i].rbegin()+1, loops[i].rend(), std::back_inserter(face_loops.back()));
 
+      std::vector<carve::geom2d::P2> projected;
+      projected.reserve(face_loops.back().size());
+      for (size_t i = 0; i < face_loops.back().size(); ++i) {
+        projected.push_back(face->project(face_loops.back()[i]->v));
+      }
+
+      if (carve::geom2d::signedArea(projected) > 0.0) {
+        std::swap(face_loops.back(), hole_loops.back());
+      }
+    }
+
+    // if there are holes, then they need to be merged with faces.
+    if (hole_loops.size()) {
+      mergeFacesAndHoles(face, face_loops, hole_loops, hooks);
+    }
+  }
 }
 
 
index b36aecf98be0bb6d4b92e44a3f7b124cbe4b3c79..169e5a33805cdc9f64e076dd96c59564277f5546 100644 (file)
@@ -501,10 +501,21 @@ bool carve::triangulate::detail::vertex_info::isClipable() const {
 
 
 size_t carve::triangulate::detail::removeDegeneracies(vertex_info *&begin, std::vector<carve::triangulate::tri_idx> &result) {
-  vertex_info *v = begin;
+  vertex_info *v;
   vertex_info *n;
   size_t count = 0;
+  size_t remain = 0;
+
+  v = begin;
+  do {
+    v = v->next;
+    ++remain;
+  } while (v != begin);
+
+  v = begin;
   do {
+    if (remain < 4) break;
+
     bool remove = false;
     if (v->p == v->next->p) {
       remove = true;
@@ -533,11 +544,11 @@ size_t carve::triangulate::detail::removeDegeneracies(vertex_info *&begin, std::
       if (n == begin) begin = n->next;
       n->remove();
       count++;
+      remain--;
       delete n;
-      continue;
+    } else {
+      v = v->next;
     }
-
-    v = v->next;
   } while (v != begin);
   return count;
 }
@@ -615,7 +626,7 @@ bool carve::triangulate::detail::doTriangulate(vertex_info *begin, std::vector<c
   std::cerr << "remain = " << remain << std::endl;
 #endif
 
-  while (vq.size()) {
+  while (remain > 3 && vq.size()) {
     vertex_info *v = vq.pop();
     if (!v->isClipable()) {
       v->failed = true;
@@ -639,10 +650,11 @@ bool carve::triangulate::detail::doTriangulate(vertex_info *begin, std::vector<c
 #endif
 
     v->remove();
-    remain--;
     if (v == begin) begin = v->next;
     delete v;
 
+    if (--remain == 3) break;
+
     vq.updateVertex(n);
     vq.updateVertex(p);
 
@@ -676,27 +688,7 @@ bool carve::triangulate::detail::doTriangulate(vertex_info *begin, std::vector<c
   std::cerr << "doTriangulate complete; remain=" << remain << std::endl;
 #endif
 
-  bool ret = true;
-
   if (remain > 3) {
-    std::vector<carve::geom2d::P2> temp;
-    temp.reserve(remain);
-    vertex_info *v = begin;
-
-    do {
-      temp.push_back(v->p);
-      v = v->next;
-    } while (v != begin);
-
-    if (carve::geom2d::signedArea(temp) == 0) {
-      // XXX: this test will fail in cases where the boundary is
-      // twisted so that a negative area balances a positive area.
-#if defined(CARVE_DEBUG)
-      std::cerr << "skeleton remains. complete." << std::endl;
-#endif
-      goto done;
-    }
-
 #if defined(CARVE_DEBUG)
     std::cerr << "before removeDegeneracies: remain=" << remain << std::endl;
 #endif
@@ -704,18 +696,16 @@ bool carve::triangulate::detail::doTriangulate(vertex_info *begin, std::vector<c
 #if defined(CARVE_DEBUG)
     std::cerr << "after removeDegeneracies: remain=" << remain << std::endl;
 #endif
+
+    if (remain > 3) {
+      return splitAndResume(begin, result);
+    }
   }
 
-  if (remain > 3) {
-    return splitAndResume(begin, result);
-  } else if (remain == 3) {
+  if (remain == 3) {
     result.push_back(carve::triangulate::tri_idx(begin->idx, begin->next->idx, begin->next->next->idx));
-    ret = true;
-  } else {
-    ret = true;
   }
 
- done:
   vertex_info *d = begin;
   do {
     vertex_info *n = d->next;
@@ -723,7 +713,7 @@ bool carve::triangulate::detail::doTriangulate(vertex_info *begin, std::vector<c
     d = n;
   } while (d != begin);
 
-  return ret;
+  return true;
 }
 
 
index 5a847ff26d4c06c17d10f712efa55e2256a41cb2..d94c7573a9dff68843def0630414a668217a8b9c 100644 (file)
@@ -40,6 +40,7 @@
 #include <iostream>
 
 using namespace carve::mesh;
+using namespace carve::geom;
 typedef unsigned int uint;
 
 #define MAX(x,y) ((x)>(y)?(x):(y))
@@ -65,71 +66,183 @@ static int isFacePlanar(CSG_IFace &face, std::vector<carve::geom3d::Vector> &ver
        return 1;
 }
 
-static MeshSet<3> *Carve_meshSetFromMeshes(std::vector<MeshSet<3>::mesh_t*> &meshes)
+static void Carve_copyMeshes(std::vector<MeshSet<3>::mesh_t*> &meshes, std::vector<MeshSet<3>::mesh_t*> &new_meshes)
 {
-       std::vector<MeshSet<3>::mesh_t*> new_meshes;
-
        std::vector<MeshSet<3>::mesh_t*>::iterator it = meshes.begin();
+
        for(; it!=meshes.end(); it++) {
                MeshSet<3>::mesh_t *mesh = *it;
                MeshSet<3>::mesh_t *new_mesh = new MeshSet<3>::mesh_t(mesh->faces);
 
                new_meshes.push_back(new_mesh);
        }
+}
+
+static MeshSet<3> *Carve_meshSetFromMeshes(std::vector<MeshSet<3>::mesh_t*> &meshes)
+{
+       std::vector<MeshSet<3>::mesh_t*> new_meshes;
+
+       Carve_copyMeshes(meshes, new_meshes);
 
        return new MeshSet<3>(new_meshes);
 }
 
-static void Carve_getIntersectedOperandMeshes(std::vector<MeshSet<3>::mesh_t*> &meshes,
-                                              std::vector<MeshSet<3>::aabb_t> &precomputedAABB,
-                                              MeshSet<3>::aabb_t &otherAABB,
+static MeshSet<3> *Carve_meshSetFromTwoMeshes(std::vector<MeshSet<3>::mesh_t*> &left_meshes,
+                                              std::vector<MeshSet<3>::mesh_t*> &right_meshes)
+{
+       std::vector<MeshSet<3>::mesh_t*> new_meshes;
+
+       Carve_copyMeshes(left_meshes, new_meshes);
+       Carve_copyMeshes(right_meshes, new_meshes);
+
+       return new MeshSet<3>(new_meshes);
+}
+
+static bool Carve_checkEdgeFaceIntersections_do(carve::csg::Intersections &intersections,
+                                                MeshSet<3>::face_t *face_a, MeshSet<3>::edge_t *edge_b)
+{
+       if(intersections.intersects(edge_b, face_a))
+               return true;
+
+       carve::mesh::MeshSet<3>::vertex_t::vector_t _p;
+       if(face_a->simpleLineSegmentIntersection(carve::geom3d::LineSegment(edge_b->v1()->v, edge_b->v2()->v), _p))
+               return true;
+
+       return false;
+}
+
+static bool Carve_checkEdgeFaceIntersections(carve::csg::Intersections &intersections,
+                                             MeshSet<3>::face_t *face_a, MeshSet<3>::face_t *face_b)
+{
+       MeshSet<3>::edge_t *edge_b;
+
+       edge_b = face_b->edge;
+       do {
+               if(Carve_checkEdgeFaceIntersections_do(intersections, face_a, edge_b))
+                       return true;
+               edge_b = edge_b->next;
+       } while (edge_b != face_b->edge);
+
+       return false;
+}
+
+static inline bool Carve_facesAreCoplanar(const MeshSet<3>::face_t *a, const MeshSet<3>::face_t *b)
+{
+  carve::geom3d::Ray temp;
+  // XXX: Find a better definition. This may be a source of problems
+  // if floating point inaccuracies cause an incorrect answer.
+  return !carve::geom3d::planeIntersection(a->plane, b->plane, temp);
+}
+
+static bool Carve_checkMeshSetInterseciton_do(carve::csg::Intersections &intersections,
+                                              const RTreeNode<3, Face<3> *> *a_node,
+                                              const RTreeNode<3, Face<3> *> *b_node,
+                                              bool descend_a = true)
+{
+       if(!a_node->bbox.intersects(b_node->bbox))
+               return false;
+
+       if(a_node->child && (descend_a || !b_node->child)) {
+               for(RTreeNode<3, Face<3> *> *node = a_node->child; node; node = node->sibling) {
+                       if(Carve_checkMeshSetInterseciton_do(intersections, node, b_node, false))
+                               return true;
+               }
+       }
+       else if(b_node->child) {
+               for(RTreeNode<3, Face<3> *> *node = b_node->child; node; node = node->sibling) {
+                       if(Carve_checkMeshSetInterseciton_do(intersections, a_node, node, true))
+                               return true;
+               }
+       }
+       else {
+               for(size_t i = 0; i < a_node->data.size(); ++i) {
+                       MeshSet<3>::face_t *fa = a_node->data[i];
+                       aabb<3> aabb_a = fa->getAABB();
+                       if(aabb_a.maxAxisSeparation(b_node->bbox) > carve::EPSILON) continue;
+
+                       for(size_t j = 0; j < b_node->data.size(); ++j) {
+                               MeshSet<3>::face_t *fb = b_node->data[j];
+                               aabb<3> aabb_b = fb->getAABB();
+                               if(aabb_b.maxAxisSeparation(aabb_a) > carve::EPSILON) continue;
+
+                               std::pair<double, double> a_ra = fa->rangeInDirection(fa->plane.N, fa->edge->vert->v);
+                               std::pair<double, double> b_ra = fb->rangeInDirection(fa->plane.N, fa->edge->vert->v);
+                               if(carve::rangeSeparation(a_ra, b_ra) > carve::EPSILON) continue;
+
+                               std::pair<double, double> a_rb = fa->rangeInDirection(fb->plane.N, fb->edge->vert->v);
+                               std::pair<double, double> b_rb = fb->rangeInDirection(fb->plane.N, fb->edge->vert->v);
+                               if(carve::rangeSeparation(a_rb, b_rb) > carve::EPSILON) continue;
+
+                               if(!Carve_facesAreCoplanar(fa, fb)) {
+                                       if(Carve_checkEdgeFaceIntersections(intersections, fa, fb)) {
+                                               return true;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return false;
+}
+
+static bool Carve_checkMeshSetInterseciton(RTreeNode<3, Face<3> *> *rtree_a, RTreeNode<3, Face<3> *> *rtree_b)
+{
+       carve::csg::Intersections intersections;
+
+       return Carve_checkMeshSetInterseciton_do(intersections, rtree_a, rtree_b);
+}
+
+static void Carve_getIntersectedOperandMeshes(std::vector<MeshSet<3>::mesh_t*> &meshes, MeshSet<3>::aabb_t &otherAABB,
                                               std::vector<MeshSet<3>::mesh_t*> &operandMeshes)
 {
        std::vector<MeshSet<3>::mesh_t*>::iterator it = meshes.begin();
-       std::vector<MeshSet<3>::aabb_t>::iterator aabb_it = precomputedAABB.begin();
-       std::vector<MeshSet<3>::aabb_t> usedAABB;
+       std::vector< RTreeNode<3, Face<3> *> *> meshRTree;
 
        while(it != meshes.end()) {
                MeshSet<3>::mesh_t *mesh = *it;
-               MeshSet<3>::aabb_t aabb = mesh->getAABB();
                bool isIntersect = false;
 
-               std::vector<MeshSet<3>::aabb_t>::iterator used_it = usedAABB.begin();
-               for(; used_it!=usedAABB.end(); used_it++) {
-                       MeshSet<3>::aabb_t usedAABB = *used_it;
+               RTreeNode<3, Face<3> *> *rtree = RTreeNode<3, Face<3> *>::construct_STR(mesh->faces.begin(), mesh->faces.end(), 4, 4);
 
-                       if(usedAABB.intersects(aabb) && usedAABB.intersects(otherAABB)) {
-                               isIntersect = true;
-                               break;
+               std::vector<MeshSet<3>::mesh_t*>::iterator operand_it = operandMeshes.begin();
+               std::vector<RTreeNode<3, Face<3> *> *>::iterator tree_it = meshRTree.begin();
+               for(; operand_it!=operandMeshes.end(); operand_it++, tree_it++) {
+                       RTreeNode<3, Face<3> *> *operandRTree = *tree_it;
+
+                       if(operandRTree->bbox.intersects(otherAABB)) {
+                               if(Carve_checkMeshSetInterseciton(rtree, operandRTree)) {
+                                       isIntersect = true;
+                                       break;
+                               }
                        }
                }
 
                if(!isIntersect) {
                        operandMeshes.push_back(mesh);
-                       usedAABB.push_back(aabb);
+                       meshRTree.push_back(rtree);
 
                        it = meshes.erase(it);
-                       aabb_it = precomputedAABB.erase(aabb_it);
                }
                else {
                        it++;
-                       aabb_it++;
                }
        }
+
+       std::vector<RTreeNode<3, Face<3> *> *>::iterator tree_it = meshRTree.begin();
+       for(; tree_it != meshRTree.end(); tree_it++) {
+               delete *tree_it;
+       }
 }
 
-static MeshSet<3> *Carve_getIntersectedOperand(std::vector<MeshSet<3>::mesh_t*> &meshes,
-                                               std::vector<MeshSet<3>::aabb_t> &precomputedAABB,
-                                               MeshSet<3>::aabb_t &otherAABB)
+static MeshSet<3> *Carve_getIntersectedOperand(std::vector<MeshSet<3>::mesh_t*> &meshes, MeshSet<3>::aabb_t &otherAABB)
 {
        std::vector<MeshSet<3>::mesh_t*> operandMeshes;
-       Carve_getIntersectedOperandMeshes(meshes, precomputedAABB, otherAABB, operandMeshes);
+       Carve_getIntersectedOperandMeshes(meshes, otherAABB, operandMeshes);
 
        return Carve_meshSetFromMeshes(operandMeshes);
 }
 
 static MeshSet<3> *Carve_unionIntersectingMeshes(MeshSet<3> *poly,
-                                                 std::vector<MeshSet<3>::aabb_t> &precomputedAABB,
                                                  MeshSet<3>::aabb_t &otherAABB,
                                                  carve::interpolate::FaceAttr<uint> &oface_num)
 {
@@ -144,10 +257,10 @@ static MeshSet<3> *Carve_unionIntersectingMeshes(MeshSet<3> *poly,
        std::vector<MeshSet<3>::mesh_t*> orig_meshes =
                        std::vector<MeshSet<3>::mesh_t*>(poly->meshes.begin(), poly->meshes.end());
 
-       MeshSet<3> *left = Carve_getIntersectedOperand(orig_meshes, precomputedAABB, otherAABB);
+       MeshSet<3> *left = Carve_getIntersectedOperand(orig_meshes, otherAABB);
 
        while(orig_meshes.size()) {
-               MeshSet<3> *right = Carve_getIntersectedOperand(orig_meshes, precomputedAABB, otherAABB);
+               MeshSet<3> *right = Carve_getIntersectedOperand(orig_meshes, otherAABB);
 
                try {
                        if(left->meshes.size()==0) {
@@ -167,7 +280,12 @@ static MeshSet<3> *Carve_unionIntersectingMeshes(MeshSet<3> *poly,
                catch(carve::exception e) {
                        std::cerr << "CSG failed, exception " << e.str() << std::endl;
 
+                       MeshSet<3> *result = Carve_meshSetFromTwoMeshes(left->meshes, right->meshes);
+
+                       delete left;
                        delete right;
+
+                       left = result;
                }
                catch(...) {
                        delete left;
@@ -180,38 +298,16 @@ static MeshSet<3> *Carve_unionIntersectingMeshes(MeshSet<3> *poly,
        return left;
 }
 
-static MeshSet<3>::aabb_t Carve_computeAABB(MeshSet<3> *poly,
-                                            std::vector<MeshSet<3>::aabb_t> &precomputedAABB)
-{
-       MeshSet<3>::aabb_t overallAABB;
-       std::vector<MeshSet<3>::mesh_t*>::iterator it = poly->meshes.begin();
-
-       for(; it!=poly->meshes.end(); it++) {
-               MeshSet<3>::aabb_t aabb;
-               MeshSet<3>::mesh_t *mesh = *it;
-
-               aabb = mesh->getAABB();
-               precomputedAABB.push_back(aabb);
-
-               overallAABB.unionAABB(aabb);
-       }
-
-       return overallAABB;
-}
-
-static void Carve_prepareOperands(MeshSet<3> **left_r, MeshSet<3> **right_r,
-                                  carve::interpolate::FaceAttr<uint> &oface_num)
+static void Carve_unionIntersections(MeshSet<3> **left_r, MeshSet<3> **right_r,
+                                     carve::interpolate::FaceAttr<uint> &oface_num)
 {
        MeshSet<3> *left, *right;
 
-       std::vector<MeshSet<3>::aabb_t> left_precomputedAABB;
-       std::vector<MeshSet<3>::aabb_t> right_precomputedAABB;
-
-       MeshSet<3>::aabb_t leftAABB = Carve_computeAABB(*left_r, left_precomputedAABB);
-       MeshSet<3>::aabb_t rightAABB = Carve_computeAABB(*right_r, right_precomputedAABB);
+       MeshSet<3>::aabb_t leftAABB = (*left_r)->getAABB();
+       MeshSet<3>::aabb_t rightAABB = (*right_r)->getAABB();
 
-       left = Carve_unionIntersectingMeshes(*left_r, left_precomputedAABB, rightAABB, oface_num);
-       right = Carve_unionIntersectingMeshes(*right_r, right_precomputedAABB, leftAABB, oface_num);
+       left = Carve_unionIntersectingMeshes(*left_r, rightAABB, oface_num);
+       right = Carve_unionIntersectingMeshes(*right_r, leftAABB, oface_num);
 
        if(left != *left_r)
                delete *left_r;
@@ -233,9 +329,9 @@ static MeshSet<3> *Carve_addMesh(CSG_FaceIteratorDescriptor &face_it,
 
        while (!vertex_it.Done(vertex_it.it)) {
                vertex_it.Fill(vertex_it.it,&vertex);
-               vertices.push_back(carve::geom::VECTOR(vertex.position[0],
-                                                      vertex.position[1],
-                                                      vertex.position[2]));
+               vertices.push_back(VECTOR(vertex.position[0],
+                                         vertex.position[1],
+                                         vertex.position[2]));
                vertex_it.Step(vertex_it.it);
        }
 
@@ -522,19 +618,6 @@ BoolOpState BOP_performBooleanOperation(BoolOpType                    opType,
        left = Carve_addMesh(obAFaces, obAVertices, oface_num, num_origfaces );
        right = Carve_addMesh(obBFaces, obBVertices, oface_num, num_origfaces );
 
-       Carve_prepareOperands(&left, &right, oface_num);
-
-       if(left->meshes.size() == 0 || right->meshes.size()==0) {
-               // normally sohuldn't happen (zero-faces objects are handled by modifier itself), but
-               // unioning intersecting meshes which doesn't have consistent normals might lead to
-               // empty result which wouldn't work here
-
-               delete left;
-               delete right;
-
-               return BOP_ERROR;
-       }
-
        min.x = max.x = left->vertex_storage[0].v.x;
        min.y = max.y = left->vertex_storage[0].v.y;
        min.z = max.z = left->vertex_storage[0].v.z;
@@ -562,6 +645,23 @@ BoolOpState BOP_performBooleanOperation(BoolOpType                    opType,
        left->transform(fwd_r);
        right->transform(fwd_r);
 
+       // prepare operands for actual boolean operation. it's needed because operands might consist of
+       // several intersecting meshes and in case if another operands intersect an edge loop of intersecting that
+       // meshes tesselation of operation result can't be done properly. the only way to make such situations
+       // working is to union intersecting meshes of the same operand
+       Carve_unionIntersections(&left, &right, oface_num);
+
+       if(left->meshes.size() == 0 || right->meshes.size()==0) {
+               // normally sohuldn't happen (zero-faces objects are handled by modifier itself), but
+               // unioning intersecting meshes which doesn't have consistent normals might lead to
+               // empty result which wouldn't work here
+
+               delete left;
+               delete right;
+
+               return BOP_ERROR;
+       }
+
        csg.hooks.registerHook(new carve::csg::CarveTriangulator, carve::csg::CSG::Hooks::PROCESS_OUTPUT_FACE_BIT);
 
        oface_num.installHooks(csg);
index 2314d935214df1e0ac35aec1a3b8da169ae02a50..3ba9e201d11c42698f0f7eaa25ae7dc6e953b91b 100644 (file)
@@ -93,7 +93,7 @@ class ExportCyclesXML(bpy.types.Operator, ExportHelper):
 
     @classmethod
     def poll(cls, context):
-        return context.active_object != None
+        return (context.active_object is not None)
 
     def execute(self, context):
         filepath = bpy.path.ensure_ext(self.filepath, ".xml")
index 6353bf37a15b94473040f45e9844a20d2c67e86a..c966792ed29a98aedda9ad08dbcb65973ce6ae2d 100644 (file)
@@ -370,7 +370,7 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
         visibility = ob.cycles_visibility
 
         flow = layout.column_flow()
-        
+
         flow.prop(visibility, "camera")
         flow.prop(visibility, "diffuse")
         flow.prop(visibility, "glossy")
@@ -606,6 +606,7 @@ class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel):
 
         col = split.column()
         col.prop(cmat, "sample_as_light")
+        col.prop(mat, "pass_index")
 
 
 class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
index 513a453b58597976119c8d52969e4a59f05e91b5..2243858a403f4afa17e16c56c8cd72ab1556701a 100644 (file)
@@ -116,7 +116,8 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
 
        if(ls.shader & SHADER_CAST_SHADOW) {
                /* setup ray */
-               ray->P = ray_offset(sd->P, sd->Ng);
+               bool transmit = (dot(sd->Ng, ls.D) < 0.0f);
+               ray->P = ray_offset(sd->P, (transmit)? -sd->Ng: sd->Ng);
 
                if(ls.t == FLT_MAX) {
                        /* distant light */
index 1a42cf1ed7ec169c8110799a58a89e0916e79e82..05ee3212b4c8ef993d16a9a47d2bdd2fc43606a9 100644 (file)
@@ -220,9 +220,7 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
 
        path_radiance_init(&L, kernel_data.film.use_light_pass);
 
-#if defined(__EMISSION__) || defined(__BACKGROUND__)
        float ray_pdf = 0.0f;
-#endif
        PathState state;
        int rng_offset = PRNG_BASE_NUM;
 
@@ -344,9 +342,8 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
                path_radiance_bsdf_bounce(&L, &throughput, &bsdf_eval, bsdf_pdf, state.bounce, label);
 
                /* set labels */
-#if defined(__EMISSION__) || defined(__BACKGROUND__)
-               ray_pdf = bsdf_pdf;
-#endif
+               if(!(label & LABEL_TRANSPARENT))
+                       ray_pdf = bsdf_pdf;
 
                /* update path state */
                path_state_next(kg, &state, label);
index 0f04af1275dd3989f81a11e14c28440d9b13722f..7e0b0ff4d0f574d02d0aa5cdba629a3c43abc4aa 100644 (file)
@@ -300,7 +300,7 @@ __device_inline void _shader_bsdf_multi_eval(const ShaderData *sd, const float3
                }
        }
 
-       *pdf = sum_pdf/sum_sample_weight;
+       *pdf = (sum_sample_weight > 0.0f)? sum_pdf/sum_sample_weight: 0.0f;
 }
 
 #endif
index fc12f22cfe686266e53cf9bfa1d788f1afb2b97e..94aca280a0eeba7f624936f4d2c6f0b81e22ed23 100644 (file)
@@ -65,8 +65,8 @@ class MEM_CacheLimiter;
 
 #ifndef __MEM_cache_limiter_c_api_h_included__
 extern "C" {
-       extern void MEM_CacheLimiter_set_maximum(intptr_t m);
-       extern intptr_t MEM_CacheLimiter_get_maximum();
+       extern void MEM_CacheLimiter_set_maximum(size_t m);
+       extern size_t MEM_CacheLimiter_get_maximum();
 };
 #endif
 
@@ -125,7 +125,7 @@ class MEM_CacheLimiter {
 public:
        typedef typename std::list<MEM_CacheLimiterHandle<T> *,
          MEM_Allocator<MEM_CacheLimiterHandle<T> *> >::iterator iterator;
-       typedef intptr_t (*MEM_CacheLimiter_DataSize_Func) (void *data);
+       typedef size_t (*MEM_CacheLimiter_DataSize_Func) (void *data);
        MEM_CacheLimiter(MEM_CacheLimiter_DataSize_Func getDataSize_)
                : getDataSize(getDataSize_) {
        }
@@ -146,8 +146,8 @@ public:
                delete handle;
        }
        void enforce_limits() {
-               intptr_t max = MEM_CacheLimiter_get_maximum();
-               intptr_t mem_in_use, cur_size;
+               size_t max = MEM_CacheLimiter_get_maximum();
+               size_t mem_in_use, cur_size;
 
                if (max == 0) {
                        return;
@@ -188,8 +188,8 @@ public:
                handle->me = it;
        }
 private:
-       intptr_t total_size() {
-               intptr_t size = 0;
+       size_t total_size() {
+               size_t size = 0;
                for (iterator it = queue.begin(); it != queue.end(); it++) {
                        size+= getDataSize((*it)->get()->get_data());
                }
index 768842caee6a7875556ec0de67e1bb3eecc827a8..c8672fa03fdb5284552fdf62fa8b6d4f676c770a 100644 (file)
@@ -42,10 +42,10 @@ typedef struct MEM_CacheLimiterHandle_s MEM_CacheLimiterHandleC;
 typedef void(*MEM_CacheLimiter_Destruct_Func)(void*);
 
 /* function used to measure stored data element size */
-typedef intptr_t(*MEM_CacheLimiter_DataSize_Func) (void*);
+typedef size_t(*MEM_CacheLimiter_DataSize_Func) (void*);
 
 #ifndef MEM_CACHELIMITER_H
-extern void MEM_CacheLimiter_set_maximum(int m);
+extern void MEM_CacheLimiter_set_maximum(size_t m);
 extern int MEM_CacheLimiter_get_maximum(void);
 #endif // MEM_CACHELIMITER_H
 /** 
index 4fdbbf8f9d4c899cb8468358597ed28e032e3d3c..0ec1ccddb15b7d3e5e9a6c57598ef2d93bbffc02 100644 (file)
 #include "MEM_CacheLimiter.h"
 #include "MEM_CacheLimiterC-Api.h"
 
-static intptr_t & get_max() 
+static size_t & get_max()
 {
-       static intptr_t m = 32*1024*1024;
+       static size_t m = 32*1024*1024;
        return m;
 }
 
-void MEM_CacheLimiter_set_maximum(intptr_t m)
+void MEM_CacheLimiter_set_maximum(size_t m)
 {
        get_max() = m;
 }
 
-intptr_t MEM_CacheLimiter_get_maximum()
+size_t MEM_CacheLimiter_get_maximum()
 {
        return get_max();
 }
index c9c1dc05476461eef078397ad417e505c54d4831..66b774e63016423b63e66f7be33e8d70db0c88cc 100644 (file)
@@ -44,7 +44,7 @@ def add_object_align_init(context, operator):
     properties = operator.properties if operator is not None else None
 
     space_data = context.space_data
-    if space_data.type != 'VIEW_3D':
+    if space_data and space_data.type != 'VIEW_3D':
         space_data = None
 
     # location
index 787f3be4e76e3fae16ead2fc6ab00b28e9f02f94..aa4f3a35e6d7452a93a9f942213b34fffab56b56 100644 (file)
@@ -69,7 +69,7 @@ def CLIP_camera_for_clip(context, clip):
         if ob.type == 'CAMERA':
             for con in ob.constraints:
                 if con.type == 'CAMERA_SOLVER':
-                    cur_clip = scene.clip if con.use_active_clip else con.clip
+                    cur_clip = scene.active_clip if con.use_active_clip else con.clip
 
                     if cur_clip == clip:
                         return ob
@@ -834,8 +834,9 @@ class CLIP_OT_setup_tracking_scene(Operator):
 
         return {'FINISHED'}
 
+
 class CLIP_OT_track_settings_as_default(Operator):
-    """Copy trackign settings from active track to default settings"""
+    """Copy tracking settings from active track to default settings"""
 
     bl_idname = "clip.track_settings_as_default"
     bl_label = "Track Settings As Default"
index 738cc7b24e00047f406e418871c41d5a1f27f89b..b7c6b8589136280fc0f9931591a97c92766cb0ba 100644 (file)
 
 import bpy
 from bpy.types import Operator
-from bpy.props import StringProperty, BoolProperty, EnumProperty, IntProperty
+from bpy.props import (StringProperty,
+                       BoolProperty,
+                       EnumProperty,
+                       IntProperty)
 
 
 class SelectPattern(Operator):
@@ -54,7 +57,7 @@ class SelectPattern(Operator):
             pattern_match = fnmatch.fnmatchcase
         else:
             pattern_match = (lambda a, b:
-                                 fnmatch.fnmatchcase(a.upper(), b.upper()))
+                             fnmatch.fnmatchcase(a.upper(), b.upper()))
         is_ebone = False
         obj = context.object
         if obj and obj.mode == 'POSE':
@@ -489,9 +492,9 @@ class ShapeTransfer(Operator):
         return (obj and obj.mode != 'EDIT')
 
     def execute(self, context):
-        C = bpy.context
-        ob_act = C.active_object
-        objects = [ob for ob in C.selected_editable_objects if ob != ob_act]
+        ob_act = context.active_object
+        objects = [ob for ob in context.selected_editable_objects
+                   if ob != ob_act]
 
         if 1:  # swap from/to, means we cant copy to many at once.
             if len(objects) != 1:
@@ -585,11 +588,6 @@ class MakeDupliFace(Operator):
     bl_idname = "object.make_dupli_face"
     bl_label = "Make Dupli-Face"
 
-    @classmethod
-    def poll(cls, context):
-        obj = context.active_object
-        return (obj and obj.type == 'MESH')
-
     def _main(self, context):
         from mathutils import Vector
 
@@ -601,22 +599,22 @@ class MakeDupliFace(Operator):
                     Vector((-offset, +offset, 0.0)),
                     )
 
-        def matrix_to_quat(matrix):
+        def matrix_to_quad(matrix):
             # scale = matrix.median_scale
             trans = matrix.to_translation()
             rot = matrix.to_3x3()  # also contains scale
 
             return [(rot * b) + trans for b in base_tri]
-        scene = bpy.context.scene
+        scene = context.scene
         linked = {}
-        for obj in bpy.context.selected_objects:
+        for obj in context.selected_objects:
             data = obj.data
             if data:
                 linked.setdefault(data, []).append(obj)
 
         for data, objects in linked.items():
             face_verts = [axis for obj in objects
-                          for v in matrix_to_quat(obj.matrix_world)
+                          for v in matrix_to_quad(obj.matrix_world)
                           for axis in v]
 
             faces = list(range(len(face_verts) // 3))
index 79d722eb19d9d1b45bd42df59d63851d442cb9ea..3aa995353b2e649c17b5aadda8be78cdb2169ac5 100644 (file)
@@ -111,7 +111,7 @@ class DATA_PT_shape_curve(CurveButtonsPanel, Panel):
             sub = col.column()
             sub.active = (curve.dimensions == '2D' or (curve.bevel_object is None and curve.dimensions == '3D'))
             sub.prop(curve, "fill_mode", text="")
-            col.prop(curve, "use_fill_deform", text="Fill Deformed")
+            col.prop(curve, "use_fill_deform")
 
 
 class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel):
@@ -165,6 +165,10 @@ class DATA_PT_geometry_curve(CurveButtonsPanel, Panel):
         col.label(text="Bevel Object:")
         col.prop(curve, "bevel_object", text="")
 
+        row = col.row()
+        row.active = (curve.bevel_object is not None)
+        row.prop(curve, "use_fill_caps")
+
 
 class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel):
     bl_label = "Path Animation"
index 5be9e57356cb006994539e836b46bdb1f2940bea..7828d90b39d92f11ee296c8a67afcab23214abf8 100644 (file)
@@ -226,10 +226,10 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel):
             row.alignment = 'RIGHT'
 
             sub = row.row(align=True)
+            sub.label()  # XXX, for alignment only
             subsub = sub.row(align=True)
             subsub.active = enable_edit_value
             subsub.prop(ob, "show_only_shape_key", text="")
-            subsub.prop(kb, "mute", text="")
             sub.prop(ob, "use_shape_key_edit_mode", text="")
 
             sub = row.row()
index 766daba58b8388ed6ce7cad659effcfb2cf876fa..354b70c19c28981aa92b1bf7320e93eaa6b12ef0 100644 (file)
@@ -814,12 +814,12 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
     def REMESH(self, layout, ob, md):
         layout.prop(md, "mode")
-        
+
         row = layout.row()
         row.prop(md, "octree_depth")
         row.prop(md, "scale")
 
-        if md.mode == "SHARP":
+        if md.mode == 'SHARP':
             layout.prop(md, "sharpness")
 
         layout.prop(md, "remove_disconnected_pieces")
index dff23e6238f0dae79a5daedb0171f294b874d41b..68c00691122e6dbd4bcd5bd6ff818a9afea712b2 100644 (file)
@@ -435,23 +435,23 @@ class ConstraintButtonsPanel():
         self.target_template(layout, con)
 
         split = layout.split()
-        
+
         col = split.column()
         col.label(text="From Target:")
         col.prop(con, "transform_channel", text="")
         col.prop(con, "target_space", text="")
-        
+
         col = split.column()
         col.label(text="To Action:")
         col.prop(con, "action", text="")
-        
+
         split = layout.split()
-        
+
         col = split.column(align=True)
         col.label(text="Target Range:")
         col.prop(con, "min", text="Min")
         col.prop(con, "max", text="Max")
-        
+
         col = split.column(align=True)
         col.label(text="Action Range:")
         col.prop(con, "frame_start", text="Start")
index 114d74f1060d5b7ef95a47d15fc043ab1d6bba1e..363b0f20428e0b1922f2debeb8f5d77f0e722a41 100644 (file)
@@ -85,6 +85,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
             col.label()
             col.prop(fluid, "use_speed_vectors")
             col.prop(fluid, "use_reverse_frames")
+            col.prop(fluid, "frame_offset", text="Offset")
 
             layout.prop(fluid, "filepath", text="")
 
index e7ccc1e624ece20fd8fde248b6c3f91d2d69aa12..8ebc1c450b4b1dcbb52951f903ad3de6d2a1af25 100644 (file)
@@ -128,9 +128,12 @@ class CLIP_PT_tools_marker(Panel):
             col.separator()
 
             row = col.row(align=True)
-            row.prop(settings, "use_default_red_channel", text="R", toggle=True)
-            row.prop(settings, "use_default_green_channel", text="G", toggle=True)
-            row.prop(settings, "use_default_blue_channel", text="B", toggle=True)
+            row.prop(settings, "use_default_red_channel",
+                     text="R", toggle=True)
+            row.prop(settings, "use_default_green_channel",
+                     text="G", toggle=True)
+            row.prop(settings, "use_default_blue_channel",
+                     text="B", toggle=True)
 
             col.separator()
 
@@ -155,7 +158,8 @@ class CLIP_PT_tools_marker(Panel):
             col.prop(settings, "default_pattern_match", text="")
 
             col.separator()
-            col.operator('clip.track_settings_as_default', text="Copy From Active Track")
+            col.operator('clip.track_settings_as_default',
+                         text="Copy From Active Track")
 
 
 class CLIP_PT_tools_tracking(Panel):
@@ -720,17 +724,21 @@ class CLIP_PT_proxy(Panel):
 
         layout.active = clip.use_proxy
 
-        layout.label(text="Build Sizes:")
+        layout.label(text="Build Original:")
 
-        row = layout.row()
-        row.prop(clip.proxy, "build_25")
-        row.prop(clip.proxy, "build_50")
+        row = layout.row(align=True)
+        row.prop(clip.proxy, "build_25", toggle=True)
+        row.prop(clip.proxy, "build_50", toggle=True)
+        row.prop(clip.proxy, "build_75", toggle=True)
+        row.prop(clip.proxy, "build_100", toggle=True)
 
-        row = layout.row()
-        row.prop(clip.proxy, "build_75")
-        row.prop(clip.proxy, "build_100")
+        layout.label(text="Build Undistorted:")
 
-        layout.prop(clip.proxy, "build_undistorted")
+        row = layout.row(align=True)
+        row.prop(clip.proxy, "build_undistorted_25", toggle=True)
+        row.prop(clip.proxy, "build_undistorted_50", toggle=True)
+        row.prop(clip.proxy, "build_undistorted_75", toggle=True)
+        row.prop(clip.proxy, "build_undistorted_100", toggle=True)
 
         layout.prop(clip.proxy, "quality")
 
@@ -738,7 +746,7 @@ class CLIP_PT_proxy(Panel):
         if clip.use_proxy_custom_directory:
             layout.prop(clip.proxy, "directory")
 
-        layout.operator("clip.rebuild_proxy", text="Rebuild Proxy")
+        layout.operator("clip.rebuild_proxy", text="Build Proxy")
 
         if clip.source == 'MOVIE':
             col = layout.column()
index aabf86c6c18b44cec35b8a4ac124f7c138b23566..c0cc692f2f1913428bd9424283ba1bd8451e8880 100644 (file)
@@ -21,6 +21,7 @@ import bpy
 from bpy.types import Header, Menu, Panel
 from .properties_paint_common import UnifiedPaintPanel
 
+
 class ImagePaintPanel(UnifiedPaintPanel):
     bl_space_type = 'IMAGE_EDITOR'
     bl_region_type = 'UI'
@@ -92,7 +93,7 @@ class IMAGE_MT_select(Menu):
         layout = self.layout
 
         layout.operator("uv.select_border").pinned = False
-        layout.operator("uv.select_border").pinned = True
+        layout.operator("uv.select_border", text="Border Select Pinned").pinned = True
 
         layout.separator()
 
@@ -677,7 +678,7 @@ class IMAGE_PT_paint(Panel, ImagePaintPanel):
             row = col.row(align=True)
             self.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
             self.prop_unified_strength(row, context, brush, "use_pressure_strength")
-            
+
             row = col.row(align=True)
             row.prop(brush, "jitter", slider=True)
             row.prop(brush, "use_pressure_jitter", toggle=True, text="")
@@ -826,7 +827,7 @@ class IMAGE_UV_sculpt(Panel, ImagePaintPanel):
             row = col.row(align=True)
             self.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
             self.prop_unified_strength(row, context, brush, "use_pressure_strength")
-            
+
         split = layout.split()
         col = split.column()
 
index d29dff491329c490c1b8386cf8ed20f844602c8c..0114f33928a097882e67baeb151062626f4cb451 100644 (file)
@@ -58,7 +58,7 @@ class NODE_HT_header(Header):
                 # Don't show "Use Nodes" Button when Engine is BI for Lamps
                 if snode_id and not (scene.render.use_shading_nodes == 0 and ob.type == 'LAMP'):
                     layout.prop(snode_id, "use_nodes")
-                    
+
             if snode.shader_type == 'WORLD':
                 layout.template_ID(scene, "world", new="world.new")
                 if snode_id:
index a045f47cb40293717d15c478173f91fd1a874252..8752defcc15f50b284f7af6ab4690c8023d6e535 100644 (file)
@@ -197,6 +197,7 @@ void BLF_dir_free(char **dirs, int count);
 #define BLF_KERNING_DEFAULT (1<<3)
 #define BLF_MATRIX (1<<4)
 #define BLF_ASPECT (1<<5)
+#define BLF_TEXFILTER (1<<6)
 
 #define BLF_DRAW_STR_DUMMY_MAX 1024
 
index d92829785620aa615ed90e321d33075ba717a2d7..ebf9ff4db39b831f4157c915aef1b9d475bab658 100644 (file)
@@ -57,5 +57,7 @@ if(WITH_INTERNATIONAL)
        add_definitions(-DWITH_INTERNATIONAL)
 endif()
 
+add_definitions(-DGLEW_STATIC)
+
 blender_add_lib(bf_blenfont "${SRC}" "${INC}" "${INC_SYS}")
 
index 1a86d0ad671fc70dc5f234dfdbdbf9b1823354e9..c46960d2311c5ca83fcf8a01427fb2f8ccc647c7 100644 (file)
@@ -9,7 +9,7 @@ incs += ' #/extern/glew/include'
 incs += ' ' + env['BF_FREETYPE_INC']
 incs += ' ' + env['BF_GETTEXT_INC']
 
-defs = []
+defs = ['GLEW_STATIC']
 
 if sys.platform == 'win32' or env['OURPLATFORM'] == 'linuxcross':
     defs.append('_WIN32')
index f0cfcdc97b9a1d4f3de36359b68d03a5ce73d76e..ab7ef8072a9808741fe34db50ec78f2065ab3bdb 100644 (file)
@@ -54,6 +54,8 @@
 #include "blf_internal_types.h"
 #include "blf_internal.h"
 
+#define _BLF_PADDING 3
+#define _BLF_MIPMAP_LEVELS 3
 
 GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
 {
@@ -87,7 +89,11 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
        gc->cur_tex= -1;
        gc->x_offs= 0;
        gc->y_offs= 0;
-       gc->pad= 3;
+       /* Increase padding for each mipmap level: 0->3, 1->4, 2->6, 3->10, ... */
+       if (font->flags & BLF_TEXFILTER)
+               gc->pad= pow(2, _BLF_MIPMAP_LEVELS) + 2;
+       else
+               gc->pad= _BLF_PADDING;
 
        gc->num_glyphs= font->face->num_glyphs;
        gc->rem_glyphs= font->face->num_glyphs;
@@ -296,13 +302,17 @@ void blf_glyph_free(GlyphBLF *g)
 
 static void blf_texture_draw(float uv[2][2], float dx, float y1, float dx1, float y2)
 {
-       
+       /* When a string is being rendered as individual glyphs (as in the game
+        * engine), the leading edge needs to be raised a fraction to prevent
+        * z-fighting for kerned characters. - z0r */
+       const float twist = (dx1 - dx) * 0.0002f;
+
        glBegin(GL_QUADS);
        glTexCoord2f(uv[0][0], uv[0][1]);
-       glVertex2f(dx, y1);
+       glVertex3f(dx, y1, twist);
        
        glTexCoord2f(uv[0][0], uv[1][1]);
-       glVertex2f(dx, y2);
+       glVertex3f(dx, y2, twist);
        
        glTexCoord2f(uv[1][0], uv[1][1]);
        glVertex2f(dx1, y2);
@@ -405,6 +415,15 @@ int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
 
                glBindTexture(GL_TEXTURE_2D, g->tex);
                glTexSubImage2D(GL_TEXTURE_2D, 0, g->xoff, g->yoff, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap);
+               if (font->flags & BLF_TEXFILTER) {
+                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
+                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,
+                                       _BLF_MIPMAP_LEVELS);
+                       glGenerateMipmap(GL_TEXTURE_2D);
+                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                                       GL_LINEAR_MIPMAP_LINEAR);
+               }
                glPopClientAttrib();
 
                g->uv[0][0]= ((float)g->xoff) / ((float)gc->p2_width);
index c2b4e30ef3b9bb4b309f4117d454db107e7ae5ee..a55955c4d0425c9dcda55fbbf063e72525a12969 100644 (file)
@@ -61,7 +61,7 @@ void animviz_calc_motionpaths(struct Scene *scene, ListBase *targets);
 void free_path(struct Path *path);
 void calc_curvepath(struct Object *ob);
 int interval_test(int min, int max, int p1, int cycl);
-int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius, float *weight);
+int where_on_path(struct Object *ob, float ctime, float vec[4], float dir[3], float quat[4], float *radius, float *weight);
 
 /* ---------------------------------------------------- */
 /* Dupli-Geometry */
index 11ab981822e443e34ac978affb874006f73f5561..07d8d69f44ef35aaa33eb671ec107c0ee57861e6 100644 (file)
@@ -109,6 +109,8 @@ void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], flo
 void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
 
+void armature_mat_pose_to_bone_ex(struct Object *ob, struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
+
 void pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[][3], short use_compat);
 void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4], short use_comat);
 void pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]);
index dcca857179c044af935e44cca43ea99c48e7e280..b53953098967e8832901139e8c4351e25e434284 100644 (file)
@@ -59,7 +59,7 @@ void curve_deform_verts(struct Scene *scene, struct Object *cuOb, struct Object
                         struct DerivedMesh *dm, float (*vertexCos)[3],
                         int numVerts, const char *vgroup, short defaxis);
 void curve_deform_vector(struct Scene *scene, struct Object *cuOb, struct Object *target,
-                         float *orco, float *vec, float mat[][3], int no_rot_axis);
+                         float orco[3], float vec[3], float mat[][3], int no_rot_axis);
 
 void lattice_deform_verts(struct Object *laOb, struct Object *target,
                           struct DerivedMesh *dm, float (*vertexCos)[3],
index 6f404bf5feec32694d25a2576c1f7a08af968e47..eabbf4595844e5ed6f49a598dc738a22791428c2 100644 (file)
@@ -49,7 +49,7 @@ void BKE_movieclip_reload(struct MovieClip *clip);
 struct ImBuf *BKE_movieclip_get_ibuf(struct MovieClip *clip, struct MovieClipUser *user);
 struct ImBuf *BKE_movieclip_get_postprocessed_ibuf(struct MovieClip *clip, struct MovieClipUser *user, int postprocess_flag);
 struct ImBuf *BKE_movieclip_get_stable_ibuf(struct MovieClip *clip, struct MovieClipUser *user, float loc[2], float *scale, float *angle, int postprocess_flag);
-struct ImBuf *BKE_movieclip_get_ibuf_flag(struct MovieClip *clip, struct MovieClipUser *user, int flag);
+struct ImBuf *BKE_movieclip_get_ibuf_flag(struct MovieClip *clip, struct MovieClipUser *user, int flag, int cache_flag);
 void BKE_movieclip_get_size(struct MovieClip *clip, struct MovieClipUser *user, int *width, int *height);
 void BKE_movieclip_aspect(struct MovieClip *clip, float *aspx, float *aspy);
 int BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user);
@@ -64,6 +64,9 @@ void BKE_movieclip_get_cache_segments(struct MovieClip *clip, struct MovieClipUs
 void BKE_movieclip_build_proxy_frame(struct MovieClip *clip, int clip_flag, struct MovieDistortion *distortion,
                        int cfra, int *build_sizes, int build_count, int undistorted);
 
+/* cacheing flags */
+#define MOVIECLIP_CACHE_SKIP        (1<<0)
+
 /* postprocessing flags */
 #define MOVIECLIP_DISABLE_RED       (1<<0)
 #define MOVIECLIP_DISABLE_GREEN     (1<<1)
index 7f321abf48e5fd10d97c0f2b7c44ced7ffc8180c..a67a06ef9fbdeff7805152e742fd56acee196f02 100644 (file)
@@ -69,9 +69,9 @@ void init_colorband(struct ColorBand *coba, int rangetype);
 struct ColorBand *add_colorband(int rangetype);
 int do_colorband(const struct ColorBand *coba, float in, float out[4]);
 void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
-int vergcband(const void *a1, const void *a2);
 struct CBData *colorband_element_add(struct ColorBand *coba, float position);
 int colorband_element_remove(struct ColorBand *coba, int index);
+void colorband_update_sort(struct ColorBand *coba);
 
 void default_tex(struct Tex *tex);
 struct Tex *add_texture(const char *name);
index 89bad72044efb109418ad56db7f1726304816c20..fabc35361b9ad720906bb16535dcf48918e58398 100644 (file)
@@ -585,11 +585,14 @@ int interval_test(int min, int max, int p1, int cycl)
 }
 
 
-/* calculate the deformation implied by the curve path at a given parametric position, and returns whether this operation succeeded 
- *     - *vec needs FOUR items!
- *     - ctime is normalized range <0-1>
+/* calculate the deformation implied by the curve path at a given parametric position,
+ * and returns whether this operation succeeded.
+ *
+ * note: ctime is normalized range <0-1>
+ *
+ * returns OK: 1/0
  */
-int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius, float *weight)  /* returns OK */
+int where_on_path(Object *ob, float ctime, float vec[4], float dir[3], float quat[4], float *radius, float *weight)
 {
        Curve *cu;
        Nurb *nu;
index 64ea862477f595828dea59bfe45dcfc28db194c6..02b9330d5882ed451727864b97f8ed48db90c45a 100644 (file)
@@ -1319,6 +1319,23 @@ void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
        copy_v3_v3(outloc, nLocMat[3]);
 }
 
+void armature_mat_pose_to_bone_ex(Object *ob, bPoseChannel *pchan, float inmat[][4], float outmat[][4])
+{
+       bPoseChannel work_pchan = *pchan;
+
+       /* recalculate pose matrix with only parent transformations,
+        * bone loc/sca/rot is ignored, scene and frame are not used. */
+       where_is_pose_bone(NULL, ob, &work_pchan, 0.0f, FALSE);
+
+       /* find the matrix, need to remove the bone transforms first so this is
+        * calculated as a matrix to set rather then a difference ontop of whats
+        * already there. */
+       unit_m4(outmat);
+       pchan_apply_mat4(&work_pchan, outmat, FALSE);
+
+       armature_mat_pose_to_bone(&work_pchan, inmat, outmat);
+}
+
 /* same as object_mat3_to_rot() */
 void pchan_mat3_to_rot(bPoseChannel *pchan, float mat[][3], short use_compat)
 {
index d86fc5c9aeff78d7a3fb932efd8c31a2623fb16b..1beaa59baadc0510939dffe8bc142ac87ef9b2db 100644 (file)
@@ -1151,7 +1151,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
                spring->kl = MAX2(mface[i].v4, mface[i].v2);
                spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
                spring->type = CLOTH_SPRING_TYPE_SHEAR;
-               spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
+               spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
 
                BLI_linklist_append ( &edgelist[spring->ij], spring );
                BLI_linklist_append ( &edgelist[spring->kl], spring );
index 8118cf64429c52f80a0cea8ea743a454b2801bae..ad89a9c959fab5d201781c3df8bc427ffb26dcb8 100644 (file)
@@ -220,6 +220,50 @@ void constraints_clear_evalob (bConstraintOb *cob)
 
 /* -------------- Space-Conversion API -------------- */
 
+static void constraint_pchan_diff_mat(bPoseChannel *pchan, float diff_mat[4][4])
+{
+       if (pchan->parent) {
+               float offs_bone[4][4];
+
+               /* construct offs_bone the same way it is done in armature.c */
+               copy_m4_m3(offs_bone, pchan->bone->bone_mat);
+               copy_v3_v3(offs_bone[3], pchan->bone->head);
+               offs_bone[3][1] += pchan->bone->parent->length;
+
+               if (pchan->bone->flag & BONE_HINGE) {
+                       /* pose_mat = par_pose-space_location * chan_mat */
+                       float tmat[4][4];
+
+                       /* the rotation of the parent restposition */
+                       copy_m4_m4(tmat, pchan->bone->parent->arm_mat);
+
+                       /* the location of actual parent transform */
+                       copy_v3_v3(tmat[3], offs_bone[3]);
+                       zero_v3(offs_bone[3]);
+                       mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
+
+                       mult_m4_m4m4(diff_mat, tmat, offs_bone);
+               }
+               else {
+                       /* pose_mat = par_pose_mat * bone_mat * chan_mat */
+                       if (pchan->bone->flag & BONE_NO_SCALE) {
+                               float tmat[4][4];
+                               copy_m4_m4(tmat, pchan->parent->pose_mat);
+                               normalize_m4(tmat);
+                               mult_m4_m4m4(diff_mat, tmat, offs_bone);
+                       }
+                       else {
+                               mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone);
+                       }
+               }
+       }
+       else {
+               /* pose_mat = chan_mat * arm_mat */
+               copy_m4_m4(diff_mat, pchan->bone->arm_mat);
+       }
+}
+
+
 /* This function is responsible for the correct transformations/conversions 
  * of a matrix from one space to another for constraint evaluation.
  * For now, this is only implemented for Objects and PoseChannels.
@@ -263,42 +307,18 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
                                /* pose to local */
                                else if (to == CONSTRAINT_SPACE_LOCAL) {
                                        if (pchan->bone) {
-                                               if (pchan->parent) {
-                                                       float offs_bone[4][4];
-                                                               
-                                                       /* construct offs_bone the same way it is done in armature.c */
-                                                       copy_m4_m3(offs_bone, pchan->bone->bone_mat);
-                                                       copy_v3_v3(offs_bone[3], pchan->bone->head);
-                                                       offs_bone[3][1]+= pchan->bone->parent->length;
-                                                       
-                                                       if (pchan->bone->flag & BONE_HINGE) {
-                                                               /* pose_mat = par_pose-space_location * chan_mat */
-                                                               float tmat[4][4];
-                                                               
-                                                               /* the rotation of the parent restposition */
-                                                               copy_m4_m4(tmat, pchan->bone->parent->arm_mat);
-                                                               
-                                                               /* the location of actual parent transform */
-                                                               copy_v3_v3(tmat[3], offs_bone[3]);
-                                                               offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
-                                                               mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
-                                                               
-                                                               mult_m4_m4m4(diff_mat, tmat, offs_bone);
-                                                               invert_m4_m4(imat, diff_mat);
-                                                       }
-                                                       else {
-                                                               /* pose_mat = par_pose_mat * bone_mat * chan_mat */
-                                                               mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone);
-                                                               invert_m4_m4(imat, diff_mat);
-                                                       }
-                                               }
-                                               else {
-                                                       /* pose_mat = chan_mat * arm_mat */
-                                                       invert_m4_m4(imat, pchan->bone->arm_mat);
-                                               }
-                                               
+                                               constraint_pchan_diff_mat(pchan, diff_mat);
+
+                                               invert_m4_m4(imat, diff_mat);
+
                                                copy_m4_m4(tempmat, mat);
                                                mult_m4_m4m4(mat, imat, tempmat);
+
+                                               /* override with local location */
+                                               if ((pchan->parent) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION)) {
+                                                       armature_mat_pose_to_bone_ex(ob, pchan, pchan->pose_mat, tempmat);
+                                                       copy_v3_v3(mat[3], tempmat[3]);
+                                               }
                                        }
                                }
                                /* pose to local with parent */
@@ -315,44 +335,11 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
                        {
                                /* local to pose - do inverse procedure that was done for pose to local */
                                if (pchan->bone) {
-                                       /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */                                         
-                                       if (pchan->parent) {
-                                               float offs_bone[4][4];
-                                               
-                                               /* construct offs_bone the same way it is done in armature.c */
-                                               copy_m4_m3(offs_bone, pchan->bone->bone_mat);
-                                               copy_v3_v3(offs_bone[3], pchan->bone->head);
-                                               offs_bone[3][1]+= pchan->bone->parent->length;
-                                               
-                                               if (pchan->bone->flag & BONE_HINGE) {
-                                                       /* pose_mat = par_pose-space_location * chan_mat */
-                                                       float tmat[4][4];
-                                                       
-                                                       /* the rotation of the parent restposition */
-                                                       copy_m4_m4(tmat, pchan->bone->parent->arm_mat);
-                                                       
-                                                       /* the location of actual parent transform */
-                                                       copy_v3_v3(tmat[3], offs_bone[3]);
-                                                       zero_v3(offs_bone[3]);
-                                                       mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
-                                                       
-                                                       mult_m4_m4m4(diff_mat, tmat, offs_bone);
-                                                       copy_m4_m4(tempmat, mat);
-                                                       mult_m4_m4m4(mat, diff_mat, tempmat);
-                                               }
-                                               else {
-                                                       /* pose_mat = par_pose_mat * bone_mat * chan_mat */
-                                                       mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone);
-                                                       copy_m4_m4(tempmat, mat);
-                                                       mult_m4_m4m4(mat, diff_mat, tempmat);
-                                               }
-                                       }
-                                       else {
-                                               copy_m4_m4(diff_mat, pchan->bone->arm_mat);
-                                               
-                                               copy_m4_m4(tempmat, mat);
-                                               mult_m4_m4m4(mat, diff_mat, tempmat);
-                                       }
+                                       /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */
+                                       constraint_pchan_diff_mat(pchan, diff_mat);
+
+                                       copy_m4_m4(tempmat, mat);
+                                       mult_m4_m4m4(mat, diff_mat, tempmat);
                                }
                                
                                /* use pose-space as stepping stone for other spaces */
@@ -504,13 +491,17 @@ static void contarget_get_mesh_mat (Object *ob, const char *substring, float mat
                        normalize_v3(normal);
                        copy_v3_v3(plane, tmat[1]);
                        
-                       copy_v3_v3(tmat[2], normal);
-                       cross_v3_v3v3(tmat[0], normal, plane);
-                       cross_v3_v3v3(tmat[1], tmat[2], tmat[0]);
-                       
-                       copy_m4_m3(mat, tmat);
+                       cross_v3_v3v3(mat[0], normal, plane);
+                       if(len_v3(mat[0]) < 1e-3f) {
+                               copy_v3_v3(plane, tmat[0]);
+                               cross_v3_v3v3(mat[0], normal, plane);
+                       }
+
+                       copy_v3_v3(mat[2], normal);
+                       cross_v3_v3v3(mat[1], mat[2], mat[0]);
+
                        normalize_m4(mat);
-                       
+
                        
                        /* apply the average coordinate as the new location */
                        mul_v3_m4v3(mat[3], ob->obmat, vec);
@@ -1272,7 +1263,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
                                        /* If the curve is cyclic, enable looping around if the time is
                                         * outside the bounds 0..1 */
                                        if ((curvetime < 0.0f) || (curvetime > 1.0f)) {
-                                               curvetime -= floor(curvetime);
+                                               curvetime -= floorf(curvetime);
                                        }
                                }
                                else {
index 9e9a0ca2d547b7f3a53fd2d581b356b9a20b9b95..05c56fa81019f15660bb39bd9b84937c10a66ad9 100644 (file)
@@ -381,7 +381,8 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
 {
        C->wm.window= win;
        C->wm.screen= (win)? win->screen: NULL;
-       C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
+       if(C->wm.screen)
+               C->data.scene= C->wm.screen->scene;
        C->wm.area= NULL;
        C->wm.region= NULL;
 }
@@ -389,7 +390,8 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
 void CTX_wm_screen_set(bContext *C, bScreen *screen)
 {
        C->wm.screen= screen;
-       C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
+       if(C->wm.screen)
+               C->data.scene= C->wm.screen->scene;
        C->wm.area= NULL;
        C->wm.region= NULL;
 }
index 762aaf3efc16f6a0bc1c1c21afd1ac8d74bd9812..e67056cdd9e1ada39983826eb4057adfc88ee268 100644 (file)
@@ -539,6 +539,7 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
                }
                        break;
                case OB_CURVE:
+               case OB_FONT:
                {
                        Curve *cu= ob->data;
                        
@@ -550,15 +551,11 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
                                node2 = dag_get_node(dag, cu->taperobj);
                                dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Curve Taper");
                        }
-               }
-                       break;
-               case OB_FONT: 
-               {
-                       Curve *cu= ob->data;
-                       
-                       if(cu->textoncurve) {
-                               node2 = dag_get_node(dag, cu->textoncurve);
-                               dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Texture On Curve");
+                       if(ob->type == OB_FONT) {
+                               if(cu->textoncurve) {
+                                       node2 = dag_get_node(dag, cu->textoncurve);
+                                       dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Texture On Curve");
+                               }
                        }
                }
                        break;
index e0f7691736884919260be5e0f7f72988851c4f1b..b14b9b43cf37d1508b3f6507b802a81609ff7e60 100644 (file)
@@ -1179,6 +1179,60 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
                        forRender, originalVerts, deformedVerts);
 }
 
+static void rotateBevelPiece(Curve *cu, BevPoint *bevp, DispList *dlb, float widfac, float fac, float **data_r)
+{
+       float *fp, *data = *data_r;
+       int b;
+
+       fp = dlb->verts;
+       for (b = 0; b<dlb->nr; b++,fp += 3,data += 3) {
+               if(cu->flag & CU_3D) {
+                       float vec[3];
+
+                       vec[0] = fp[1]+widfac;
+                       vec[1] = fp[2];
+                       vec[2 ]= 0.0;
+
+                       mul_qt_v3(bevp->quat, vec);
+
+                       data[0] = bevp->vec[0] + fac*vec[0];
+                       data[1] = bevp->vec[1] + fac*vec[1];
+                       data[2] = bevp->vec[2] + fac*vec[2];
+               }
+               else {
+                       data[0] = bevp->vec[0] + fac*(widfac+fp[1])*bevp->sina;
+                       data[1] = bevp->vec[1] + fac*(widfac+fp[1])*bevp->cosa;
+                       data[2] = bevp->vec[2] + fac*fp[2];
+               }
+       }
+
+       *data_r = data;
+}
+
+static void fillBevelCap(Curve *cu, Nurb *nu, BevPoint *bevp, DispList *dlb, float fac, float widfac, ListBase *dispbase)
+{
+       DispList *dl;
+       float *data;
+
+       dl= MEM_callocN(sizeof(DispList), "makeDispListbev2");
+       dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr, "dlverts");
+
+       dl->type= DL_POLY;
+
+       dl->parts= 1;
+       dl->nr= dlb->nr;
+       dl->col= nu->mat_nr;
+       dl->charidx= nu->charidx;
+
+       /* dl->rt will be used as flag for render face and */
+       /* CU_2D conflicts with R_NOPUNOFLIP */
+       dl->rt= nu->flag & ~CU_2D;
+
+       rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data);
+
+       BLI_addtail(dispbase, dl);
+}
+
 static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispbase,
        DerivedMesh **derivedFinal, int forRender, int forOrco)
 {
@@ -1223,9 +1277,9 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
 
                        for (; bl && nu; bl=bl->next,nu=nu->next) {
                                DispList *dl;
-                               float *fp1, *data;
+                               float *data;
                                BevPoint *bevp;
-                               int a,b;
+                               int a;
 
                                if (bl->nr) { /* blank bevel lists can happen */
 
@@ -1262,9 +1316,10 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
                                        }
                                        else {
                                                DispList *dlb;
+                                               ListBase bottom_capbase = {NULL, NULL};
+                                               ListBase top_capbase = {NULL, NULL};
 
                                                for (dlb=dlbev.first; dlb; dlb=dlb->next) {
-       
                                                        /* for each part of the bevel use a separate displblock */
                                                        dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
                                                        dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
@@ -1302,33 +1357,27 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
                                                                        dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
                                                                }
        
-                                                                       /* rotate bevel piece and write in data */
-                                                               fp1= dlb->verts;
-                                                               for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
-                                                                       if(cu->flag & CU_3D) {
-                                                                               float vec[3];
-       
-                                                                               vec[0]= fp1[1]+widfac;
-                                                                               vec[1]= fp1[2];
-                                                                               vec[2]= 0.0;
-
-                                                                               mul_qt_v3(bevp->quat, vec);
-
-                                                                               data[0]= bevp->vec[0] + fac*vec[0];
-                                                                               data[1]= bevp->vec[1] + fac*vec[1];
-                                                                               data[2]= bevp->vec[2] + fac*vec[2];
-                                                                       }
-                                                                       else {
-                                                                               data[0]= bevp->vec[0] + fac*(widfac+fp1[1])*bevp->sina;
-                                                                               data[1]= bevp->vec[1] + fac*(widfac+fp1[1])*bevp->cosa;
-                                                                               data[2]= bevp->vec[2] + fac*fp1[2];
-                                                                       }
+                                                               /* rotate bevel piece and write in data */
+                                                               rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data);
+
+                                                               if (cu->bevobj && (cu->flag & CU_FILL_CAPS)) {
+                                                                       if (a == 0)
+                                                                               fillBevelCap(cu, nu, bevp, dlb, fac, widfac, &bottom_capbase);
+                                                                       else if (a == bl->nr - 1)
+                                                                               fillBevelCap(cu, nu, bevp, dlb, fac, widfac, &top_capbase);
                                                                }
                                                        }
-                                                       
+
                                                        /* gl array drawing: using indices */
                                                        displist_surf_indices(dl);
                                                }
+
+                                               if(bottom_capbase.first) {
+                                                       filldisplist(&bottom_capbase, dispbase, 1);
+                                                       filldisplist(&top_capbase, dispbase, 0);
+                                                       freedisplist(&bottom_capbase);
+                                                       freedisplist(&top_capbase);
+                                               }
                                        }
                                }
 
index 318165af80402fc1156da246d7823cac41bb6a9d..5feeb4c300dac2b83792376c49db8334c186a9c6 100644 (file)
@@ -1987,7 +1987,7 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
                for (a=0; prevbezt && bezt && (a < fcu->totvert-1); a++, prevbezt=bezt, bezt++) 
                {
                        /* use if the key is directly on the frame, rare cases this is needed else we get 0.0 instead. */
-                       if(fabs(bezt->vec[1][0] - evaltime) < SMALL_NUMBER) {
+                       if(fabsf(bezt->vec[1][0] - evaltime) < SMALL_NUMBER) {
                                cvalue= bezt->vec[1][1];
                        }
                        /* evaltime occurs within the interval defined by these two keyframes */
index 4c30789db73b79530a3a09bf592c5e517c4d8d30..5e4d8d24d249ecf7ac70d585da3027baa70e678c 100644 (file)
@@ -462,32 +462,25 @@ void end_latt_deform(Object *ob)
           so we store in latmat transform from path coord inside object 
         */
 typedef struct {
-       float dmin[3], dmax[3], dscale, dloc[3];
+       float dmin[3], dmax[3];
        float curvespace[4][4], objectspace[4][4], objectspace3[3][3];
        int no_rot_axis;
 } CurveDeform;
 
-static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd, int dloc)
+static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd)
 {
        invert_m4_m4(ob->imat, ob->obmat);
        mult_m4_m4m4(cd->objectspace, ob->imat, par->obmat);
        invert_m4_m4(cd->curvespace, cd->objectspace);
        copy_m3_m4(cd->objectspace3, cd->objectspace);
-       
-       // offset vector for 'no smear'
-       if(dloc) {
-               invert_m4_m4(par->imat, par->obmat);
-               mul_v3_m4v3(cd->dloc, par->imat, ob->obmat[3]);
-       }
-       else {
-               cd->dloc[0]=cd->dloc[1]=cd->dloc[2]= 0.0f;
-       }
-       
        cd->no_rot_axis= 0;
 }
 
-/* this makes sure we can extend for non-cyclic. *vec needs 4 items! */
-static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius)   /* returns OK */
+/* this makes sure we can extend for non-cyclic.
+ *
+ * returns OK: 1/0
+ */
+static int where_on_path_deform(Object *ob, float ctime, float vec[4], float dir[3], float quat[4], float *radius)
 {
        Curve *cu= ob->data;
        BevList *bl;
@@ -532,20 +525,18 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir,
        return 0;
 }
 
-       /* for each point, rotate & translate to curve */
-       /* use path, since it has constant distances */
-       /* co: local coord, result local too */
-       /* returns quaternion for rotation, using cd->no_rot_axis */
-       /* axis is using another define!!! */
-static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, CurveDeform *cd, float *quatp)
+/* for each point, rotate & translate to curve */
+/* use path, since it has constant distances */
+/* co: local coord, result local too */
+/* returns quaternion for rotation, using cd->no_rot_axis */
+/* axis is using another define!!! */
+static int calc_curve_deform(Scene *scene, Object *par, float co[3],
+                             const short axis, CurveDeform *cd, float quat_r[4])
 {
        Curve *cu= par->data;
        float fac, loc[4], dir[3], new_quat[4], radius;
-       short /*upflag, */ index;
-
-       index= axis-1;
-       if(index>2)
-               index -= 3; /* negative  */
+       short index;
+       const int is_neg_axis = (axis > 2);
 
        /* to be sure, mostly after file load */
        if(cu->path==NULL) {
@@ -554,52 +545,24 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
        }
        
        /* options */
-       if(ELEM3(axis, OB_NEGX+1, OB_NEGY+1, OB_NEGZ+1)) { /* OB_NEG# 0-5, MOD_CURVE_POS# 1-6 */
+       if (is_neg_axis) {
+               index = axis - 3;
                if(cu->flag & CU_STRETCH)
                        fac= (-co[index]-cd->dmax[index])/(cd->dmax[index] - cd->dmin[index]);
                else
-                       fac= (cd->dloc[index])/(cu->path->totdist) - (co[index]-cd->dmax[index])/(cu->path->totdist);
+                       fac= - (co[index]-cd->dmax[index])/(cu->path->totdist);
        }
        else {
+               index = axis;
                if(cu->flag & CU_STRETCH)
                        fac= (co[index]-cd->dmin[index])/(cd->dmax[index] - cd->dmin[index]);
                else
-                       fac= (cd->dloc[index])/(cu->path->totdist) + (co[index]-cd->dmin[index])/(cu->path->totdist);
+                       fac= + (co[index]-cd->dmin[index])/(cu->path->totdist);
        }
        
-#if 0 // XXX old animation system
-       /* we want the ipo to work on the default 100 frame range, because there's no  
-          actual time involved in path position */
-       // huh? by WHY!!!!???? - Aligorith
-       if(cu->ipo) {
-               fac*= 100.0f;
-               if(calc_ipo_spec(cu->ipo, CU_SPEED, &fac)==0)
-                       fac/= 100.0;
-       }
-#endif // XXX old animation system
-       
        if( where_on_path_deform(par, fac, loc, dir, new_quat, &radius)) {      /* returns OK */
                float quat[4], cent[3];
 
-#if 0  // XXX - 2.4x Z-Up, Now use bevel tilt.
-               if(cd->no_rot_axis)     /* set by caller */
-                       dir[cd->no_rot_axis-1]= 0.0f;
-               
-               /* -1 for compatibility with old track defines */
-               vec_to_quat( quat,dir, axis-1, upflag);
-               
-               /* the tilt */
-               if(loc[3]!=0.0) {
-                       normalize_v3(dir);
-                       q[0]= (float)cos(0.5*loc[3]);
-                       fac= (float)sin(0.5*loc[3]);
-                       q[1]= -fac*dir[0];
-                       q[2]= -fac*dir[1];
-                       q[3]= -fac*dir[2];
-                       mul_qt_qtqt(quat, q, quat);
-               }
-#endif
-
                if(cd->no_rot_axis) {   /* set by caller */
 
                        /* this is not exactly the same as 2.4x, since the axis is having rotation removed rather than
@@ -634,9 +597,9 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
 
                /* zero the axis which is not used,
                 * the big block of text above now applies to these 3 lines */
-               quat_apply_track(quat, axis-1, (axis==1 || axis==3) ? 1:0); /* up flag is a dummy, set so no rotation is done */
-               vec_apply_track(cent, axis-1);
-               cent[axis < 4 ? axis-1 : axis-4]= 0.0f;
+               quat_apply_track(quat, axis, (axis == 0 || axis == 2) ? 1:0); /* up flag is a dummy, set so no rotation is done */
+               vec_apply_track(cent, axis);
+               cent[index]= 0.0f;
 
 
                /* scale if enabled */
@@ -650,8 +613,8 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
                /* translation */
                add_v3_v3v3(co, cent, loc);
 
-               if(quatp)
-                       copy_qt_qt(quatp, quat);
+               if(quat_r)
+                       copy_qt_qt(quat_r, quat);
 
                return 1;
        }
@@ -666,6 +629,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
        int a, flag;
        CurveDeform cd;
        int use_vgroups;
+       const int is_neg_axis = (defaxis > 2);
 
        if(cuOb->type != OB_CURVE)
                return;
@@ -674,10 +638,10 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
        flag = cu->flag;
        cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
 
-       init_curve_deform(cuOb, target, &cd, (cu->flag & CU_STRETCH)==0);
+       init_curve_deform(cuOb, target, &cd);
 
        /* dummy bounds, keep if CU_DEFORM_BOUNDS_OFF is set */
-       if(defaxis < 3) {
+       if(is_neg_axis == FALSE) {
                cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= 0.0f;
                cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 1.0f;
        }
@@ -711,10 +675,6 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
        
 
                        if(cu->flag & CU_DEFORM_BOUNDS_OFF) {
-                               /* dummy bounds */
-                               cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= 0.0f;
-                               cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 1.0f;
-                               
                                dvert = me->dvert;
                                for(a = 0; a < numVerts; a++, dvert++) {
                                        if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
@@ -749,6 +709,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
                                        weight= defvert_find_weight(dvert, index);
        
                                        if(weight > 0.0f) {
+                                               /* already in 'cd.curvespace', prev for loop */
                                                copy_v3_v3(vec, vertexCos[a]);
                                                calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL);
                                                interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight);
@@ -776,6 +737,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
                        }
        
                        for(a = 0; a < numVerts; a++) {
+                               /* already in 'cd.curvespace', prev for loop */
                                calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL);
                                mul_m4_v3(cd.objectspace, vertexCos[a]);
                        }
@@ -787,7 +749,8 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target,
 /* input vec and orco = local coord in armature space */
 /* orco is original not-animated or deformed reference point */
 /* result written in vec and mat */
-void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, float *orco, float *vec, float mat[][3], int no_rot_axis)
+void curve_deform_vector(Scene *scene, Object *cuOb, Object *target,
+                         float orco[3], float vec[3], float mat[][3], int no_rot_axis)
 {
        CurveDeform cd;
        float quat[4];
@@ -797,7 +760,7 @@ void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, float *orco
                return;
        }
 
-       init_curve_deform(cuOb, target, &cd, 0);        /* 0 no dloc */
+       init_curve_deform(cuOb, target, &cd);
        cd.no_rot_axis= no_rot_axis;                            /* option to only rotate for XY, for example */
        
        copy_v3_v3(cd.dmin, orco);
@@ -805,7 +768,7 @@ void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, float *orco
 
        mul_m4_v3(cd.curvespace, vec);
        
-       if(calc_curve_deform(scene, cuOb, vec, target->trackflag+1, &cd, quat)) {
+       if(calc_curve_deform(scene, cuOb, vec, target->trackflag, &cd, quat)) {
                float qmat[3][3];
                
                quat_to_mat3( qmat,quat);
@@ -885,7 +848,7 @@ int object_deform_mball(Object *ob, ListBase *dispbase)
 
 static BPoint *latt_bp(Lattice *lt, int u, int v, int w)
 {
-       return lt->def+ u + v*lt->pntsu + w*lt->pntsu*lt->pntsv;
+       return &lt->def[LT_INDEX(lt, u, v, w)];
 }
 
 void outside_lattice(Lattice *lt)
index bb8e420451fc55062fc9f289a2acd753de18f0a5..c90faa7e0ca015d9b1a5f286d1239ebd2c84f88d 100644 (file)
@@ -631,7 +631,8 @@ static ImBuf *put_postprocessed_frame_to_cache(MovieClip *clip, MovieClipUser *u
        return postproc_ibuf;
 }
 
-static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *user, int flag, int postprocess_flag)
+static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *user, int flag,
+                                               int postprocess_flag, int cache_flag)
 {
        ImBuf *ibuf= NULL;
        int framenr= user->framenr, need_postprocess= 0;
@@ -664,7 +665,7 @@ static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *u
                        ibuf= movieclip_load_movie_file(clip, user, framenr, flag);
                }
 
-               if(ibuf)
+               if(ibuf && (cache_flag & MOVIECLIP_CACHE_SKIP) == 0)
                        put_imbuf_cache(clip, user, ibuf, flag);
        }
 
@@ -687,17 +688,17 @@ static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *u
 
 ImBuf *BKE_movieclip_get_ibuf(MovieClip *clip, MovieClipUser *user)
 {
-       return BKE_movieclip_get_ibuf_flag(clip, user, clip->flag);
+       return BKE_movieclip_get_ibuf_flag(clip, user, clip->flag, 0);
 }
 
-ImBuf *BKE_movieclip_get_ibuf_flag(MovieClip *clip, MovieClipUser *user, int flag)
+ImBuf *BKE_movieclip_get_ibuf_flag(MovieClip *clip, MovieClipUser *user, int flag, int cache_flag)
 {
-       return movieclip_get_postprocessed_ibuf(clip, user, flag, 0);
+       return movieclip_get_postprocessed_ibuf(clip, user, flag, 0, cache_flag);
 }
 
 ImBuf *BKE_movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *user, int postprocess_flag)
 {
-       return movieclip_get_postprocessed_ibuf(clip, user, clip->flag, postprocess_flag);
+       return movieclip_get_postprocessed_ibuf(clip, user, clip->flag, postprocess_flag, 0);
 }
 
 static ImBuf *get_stable_cached_frame(MovieClip *clip, MovieClipUser *user, int framenr)
@@ -1021,7 +1022,7 @@ void BKE_movieclip_build_proxy_frame(MovieClip *clip, int clip_flag, struct Movi
        user.render_flag= 0;
        user.render_size= MCLIP_PROXY_RENDER_SIZE_FULL;
 
-       ibuf= BKE_movieclip_get_ibuf_flag(clip, &user, clip_flag);
+       ibuf= BKE_movieclip_get_ibuf_flag(clip, &user, clip_flag, MOVIECLIP_CACHE_SKIP);
 
        if(ibuf) {
                ImBuf *tmpibuf= ibuf;
index e3b5b83964e9f540e77fa51297a744d31a02a332..e6749730fc990f8952869343197a175e31accc09 100644 (file)
@@ -344,7 +344,7 @@ int buildNavMeshData(const int nverts, const float* verts,
                                                         int *vertsPerPoly_r, int **dtrisToPolysMap_r, int **dtrisToTrisMap_r)
 
 {
-       int *trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping");
+       int *trisMapping;
        int i;
        struct SortContext context;
        int validTriStart, prevPolyIdx, curPolyIdx, newPolyIdx, prevpolyidx;
@@ -360,6 +360,8 @@ int buildNavMeshData(const int nverts, const float* verts,
                return 0;
        }
 
+       trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping");
+
        //sort the triangles by polygon idx
        for (i=0; i<ntris; i++)
                trisMapping[i]=i;
index a8f89b0a1eb176453178028eea78b25df2bd9bd1..9edcc7a73e88dcaf4477b4cebab898e76b8c13f5 100644 (file)
@@ -1583,7 +1583,7 @@ typedef struct WipeZone {
 static void precalc_wipe_zone(WipeZone *wipezone, WipeVars *wipe, int xo, int yo)
 {
        wipezone->flip = (wipe->angle < 0);
-       wipezone->angle = tan(DEG2RAD(fabsf(wipe->angle)));
+       wipezone->angle = tanf(DEG2RADF(fabsf(wipe->angle)));
        wipezone->xo = xo;
        wipezone->yo = yo;
        wipezone->width = (int)(wipe->edgeWidth*((xo+yo)/2.0f));
@@ -1602,9 +1602,9 @@ static float in_band(float width,float dist,int side,int dir)
                return (float)side;
 
        if(side == 1)
-               alpha = (dist+0.5*width) / (width);
+               alpha = (dist+0.5f*width) / (width);
        else
-               alpha = (0.5*width-dist) / (width);
+               alpha = (0.5f*width-dist) / (width);
 
        if(dir == 0)
                alpha = 1-alpha;
index 08b531159193b8baf4a0ca3b4c1638aa4e9aab84..d18a71d3c551a17a907641cb7d1337a194a2de3f 100644 (file)
@@ -745,7 +745,7 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq, int lock_range)
                        seq->scene = sce;
                }
 
-               seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1;
+               seq->len= (seq->scene)? seq->scene->r.efra - seq->scene->r.sfra + 1: 0;
                seq->len -= seq->anim_startofs;
                seq->len -= seq->anim_endofs;
                if (seq->len < 0) {
index 88858c9ff518136e6afb38f39b11931344d508b9..4c40dca3365948503d8a8f3dfebbedcccc8adeb3 100644 (file)
@@ -478,10 +478,28 @@ int vergcband(const void *a1, const void *a2)
        return 0;
 }
 
-CBData *colorband_element_add(struct ColorBand *coba, float position)
+void colorband_update_sort(ColorBand *coba)
 {
        int a;
+       
+       if(coba->tot<2)
+               return;
+       
+       for(a=0; a<coba->tot; a++)
+               coba->data[a].cur= a;
+
+       qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
 
+       for(a=0; a<coba->tot; a++) {
+               if(coba->data[a].cur==coba->cur) {
+                       coba->cur= a;
+                       break;
+               }
+       }
+}
+
+CBData *colorband_element_add(struct ColorBand *coba, float position)
+{
        if(coba->tot==MAXCOLORBAND) {
                return NULL;
        }
@@ -503,17 +521,7 @@ CBData *colorband_element_add(struct ColorBand *coba, float position)
        coba->tot++;
        coba->cur = coba->tot-1;
 
-       for(a = 0; a < coba->tot; a++)
-               coba->data[a].cur = a;
-
-       qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
-
-       for(a = 0; a < coba->tot; a++) {
-               if(coba->data[a].cur == coba->cur) {
-                       coba->cur = a;
-                       break;
-               }
-       }
+       colorband_update_sort(coba);
 
        return coba->data + coba->cur;
 }
index 9bff5e3003dd03f25d236d28120688f4815fed77..695ea1dc07a2f2f2c57fd633a1b82847b2c0b4d9 100644 (file)
@@ -975,8 +975,8 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
        context->clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
 
        context->user= *user;
-       context->user.render_size= 0;
-       context->user.render_flag= MCLIP_PROXY_RENDER_SIZE_FULL;
+       context->user.render_size= MCLIP_PROXY_RENDER_SIZE_FULL;
+       context->user.render_flag= 0;
 
        if(!sequence)
                BLI_begin_threaded_malloc();
@@ -1226,7 +1226,7 @@ static ImBuf *get_frame_ibuf(MovieTrackingContext *context, int framenr)
 
        user.framenr= framenr;
 
-       ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &user, context->clip_flag);
+       ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &user, context->clip_flag, MOVIECLIP_CACHE_SKIP);
 
        return ibuf;
 }
@@ -1330,7 +1330,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
        if(context->backwards) context->user.framenr--;
        else context->user.framenr++;
 
-       ibuf_new= BKE_movieclip_get_ibuf_flag(context->clip, &context->user, context->clip_flag);
+       ibuf_new= BKE_movieclip_get_ibuf_flag(context->clip, &context->user, context->clip_flag, MOVIECLIP_CACHE_SKIP);
        if(!ibuf_new)
                return 0;
 
index 12795280ddd38482a2eaee1baac456c18c86dc6c..7acbf450fed8efe2e229724a2e6884af969d5344 100644 (file)
@@ -195,10 +195,12 @@ void makeFilesAbsolute(Main *bmain, const char *basedir, ReportList *reports)
 
 
 /* find this file recursively, use the biggest file so thumbnails dont get used by mistake
- - dir: subdir to search
- - filename: set this filename
- - filesize: filesize for the file
-*/
+ * - dir: subdir to search
+ * - filename: set this filename
+ * - filesize: filesize for the file
+ *
+ * return found: 1/0.
+ */
 #define MAX_RECUR 16
 static int findFileRecursive(char *filename_new,
                              const char *dirname,
@@ -212,11 +214,14 @@ static int findFileRecursive(char *filename_new,
        struct stat status;
        char path[FILE_MAX];
        int size;
+       int found = FALSE;
+
+       filename_new[0] = '\0';
 
        dir= opendir(dirname);
 
        if (dir==NULL)
-               return 0;
+               return found;
 
        if (*filesize == -1)
                *filesize= 0; /* dir opened fine */
@@ -238,19 +243,20 @@ static int findFileRecursive(char *filename_new,
                                if ((size > 0) && (size > *filesize)) { /* find the biggest file */
                                        *filesize= size;
                                        BLI_strncpy(filename_new, path, FILE_MAX);
+                                       found = TRUE;
                                }
                        }
                }
                else if (S_ISDIR(status.st_mode)) { /* is subdir */
                        if (*recur_depth <= MAX_RECUR) {
                                (*recur_depth)++;
-                               findFileRecursive(filename_new, path, filename, filesize, recur_depth);
+                               found |= findFileRecursive(filename_new, path, filename, filesize, recur_depth);
                                (*recur_depth)--;
                        }
                }
        }
        closedir(dir);
-       return 1;
+       return found;
 }
 
 typedef struct BPathFind_Data
@@ -267,19 +273,26 @@ static int findMissingFiles_visit_cb(void *userdata, char *path_dst, const char
 
        int filesize= -1;
        int recur_depth= 0;
+       int found;
 
-       findFileRecursive(filename_new,
-                         data->searchdir, BLI_path_basename((char *)path_src),
-                         &filesize, &recur_depth);
+       found = findFileRecursive(filename_new,
+                                 data->searchdir, BLI_path_basename((char *)path_src),
+                                 &filesize, &recur_depth);
 
        if (filesize == -1) { /* could not open dir */
+               BKE_reportf(data->reports, RPT_WARNING,
+                           "Could open directory \"%s\"",
+                           BLI_path_basename(data->searchdir));
+               return FALSE;
+       }
+       else if (found == FALSE) {
                BKE_reportf(data->reports, RPT_WARNING,
                            "Could not find \"%s\" in \"%s\"",
                            BLI_path_basename((char *)path_src), data->searchdir);
                return FALSE;
        }
        else {
-               strcpy(path_dst, filename_new);
+               BLI_strncpy(path_dst, filename_new, FILE_MAX);
                return TRUE;
        }
 }
index ca2aeca8f3636c1dd8456a3903176f5043977d26..b9772b1f3b4f53c72c784138083717a9386fb938 100644 (file)
@@ -561,7 +561,7 @@ void BLI_init_srgb_conversion(void)
        for (i = 0; i < 0x10000; i++) {
                float f = linearrgb_to_srgb(index_to_float(i))*255.0f;
                if (f <= 0) BLI_color_to_srgb_table[i] = 0;
-               else if (f < 255) BLI_color_to_srgb_table[i] = (unsigned short)(f*0x100+.5);
+               else if (f < 255) BLI_color_to_srgb_table[i] = (unsigned short)(f*0x100+0.5f);
                else BLI_color_to_srgb_table[i] = 0xff00;
        }
 
index 16d2c4998be30376c6e4eafb272cceaa27053d02..80953b2dbbbc6b10869edccdb7b4001ce974e88a 100644 (file)
@@ -5323,6 +5323,30 @@ static void *restore_pointer_by_name(Main *mainp, ID *id, int user)
        return NULL;
 }
 
+static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
+{
+       Main *newmain = (Main *)arg_pt;
+
+       if(seq->sound) {
+               seq->sound = restore_pointer_by_name(newmain, (ID *)seq->sound, 0);
+               seq->sound->id.us++;
+       }
+
+       if(seq->scene)
+               seq->scene = restore_pointer_by_name(newmain, (ID *)seq->scene, 1);
+
+       if(seq->scene_camera)
+               seq->scene_camera = restore_pointer_by_name(newmain, (ID *)seq->scene_camera, 1);
+
+       return 1;
+}
+
+static void lib_link_clipboard_restore(Main *newmain)
+{
+       /* update IDs stored in sequencer clipboard */
+       seqbase_recursive_apply(&seqbase_clipboard, lib_link_seq_clipboard_cb, newmain);
+}
+
 /* called from kernel/blender.c */
 /* used to link a file (without UI) to the current UI */
 /* note that it assumes the old pointers in UI are still valid, so old Main is not freed */
@@ -5530,6 +5554,9 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
                        sa= sa->next;
                }
        }
+
+       /* update IDs stored in all possible clipboards */
+       lib_link_clipboard_restore(newmain);
 }
 
 static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
index 8bc9755faae9172dba8f86809f1714dfc694458b..4a838e928da73702b5365f4cc99c4bdcbdb953a0 100644 (file)
@@ -65,6 +65,7 @@ void GeometryExporter::operator()(Object *ob)
 #endif
        Mesh *me = (Mesh*)ob->data;
        std::string geom_id = get_geometry_id(ob);
+       std::string geom_name = id_name(ob->data);
        std::vector<Normal> nor;
        std::vector<Face> norind;
 
@@ -78,7 +79,7 @@ void GeometryExporter::operator()(Object *ob)
        create_normals(nor, norind, me);
 
        // openMesh(geoId, geoName, meshId)
-       openMesh(geom_id);
+       openMesh(geom_id, geom_name);
        
        // writes <source> for vertex coords
        createVertsSource(geom_id, me);
index 9122bc277d95667f762cfe5fd5033d58365fe0e8..0c8d633be5ce38635e4bfc1406f20267b29c64ec 100644 (file)
@@ -1533,7 +1533,7 @@ static int animchannels_setflag_exec(bContext *C, wmOperator *op)
        return OPERATOR_FINISHED;
 }
 
-
+/* duplicate of 'ANIM_OT_channels_setting_toggle' for menu title only, weak! */
 static void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
 {
        /* identifiers */
@@ -1555,7 +1555,7 @@ static void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
                /* setting to set */
        ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
 }
-
+/* duplicate of 'ANIM_OT_channels_setting_toggle' for menu title only, weak! */
 static void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
 {
        /* identifiers */
@@ -1578,28 +1578,6 @@ static void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
        ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
 }
 
-static void ANIM_OT_channels_setting_invert (wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Invert Channel Setting";
-       ot->idname= "ANIM_OT_channels_setting_toggle";
-       ot->description= "Invert specified setting on all selected animation channels";
-       
-       /* api callbacks */
-       ot->invoke= WM_menu_invoke;
-       ot->exec= animchannels_setflag_exec;
-       ot->poll= animedit_poll_channels_active;
-       
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-       
-       /* props */
-               /* flag-setting mode */
-       RNA_def_enum(ot->srna, "mode", prop_animchannel_setflag_types, ACHANNEL_SETFLAG_INVERT, "Mode", "");
-               /* setting to set */
-       ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
-}
-
 static void ANIM_OT_channels_setting_toggle (wmOperatorType *ot)
 {
        /* identifiers */
@@ -2406,7 +2384,6 @@ void ED_operatortypes_animchannels(void)
        
        WM_operatortype_append(ANIM_OT_channels_setting_enable);
        WM_operatortype_append(ANIM_OT_channels_setting_disable);
-       WM_operatortype_append(ANIM_OT_channels_setting_invert);
        WM_operatortype_append(ANIM_OT_channels_setting_toggle);
        
        WM_operatortype_append(ANIM_OT_channels_delete);
index fdccf5d4baa10056824944c61b2b561e57e8dd9c..3f851938a838ffbb32e4aec5e8f44360e0b46a23 100644 (file)
@@ -148,7 +148,7 @@ static void animchan_sync_group (bAnimContext *UNUSED(ac), bAnimListElem *ale)
                        
                        /* if one matches, sync the selection status */
                        if (pchan) {
-                               if (pchan->bone->flag & BONE_SELECTED)
+                               if (pchan->bone && pchan->bone->flag & BONE_SELECTED)
                                        agrp->flag |= AGRP_SELECTED;
                                else
                                        agrp->flag &= ~AGRP_SELECTED;
index f087cdc7442020800321ec717e4f107319449aa2..7616e25cbe9c6a376d51e0887dbd0ed847dcedac 100644 (file)
@@ -52,7 +52,8 @@ struct View3D;
 struct ViewContext;
 struct wmWindow;
 struct MVert;
-
+struct wmOperatorType;
+struct wmOperator;
 
 /* for derivedmesh drawing callbacks, for view3d_select, .... */
 typedef struct ViewContext {
@@ -209,6 +210,7 @@ void project_short_noclip(struct ARegion *ar, const float vec[3], short adr[2]);
 void project_int(struct ARegion *ar, const float vec[3], int adr[2]);
 void project_int_noclip(struct ARegion *ar, const float vec[3], int adr[2]);
 
+void apply_project_float(float persmat[4][4], int winx, int winy, const float vec[], float adr[2]);
 void project_float(struct ARegion *ar, const float vec[3], float adr[2]);
 void project_float_noclip(struct ARegion *ar, const float vec[3], float adr[2]);
 
@@ -301,4 +303,9 @@ struct BGpic *ED_view3D_background_image_new(struct View3D *v3d);
 void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic);
 void ED_view3D_background_image_clear(struct View3D *v3d);
 
+/* view matrix properties utilities */
+void ED_view3d_operator_properties_viewmat(struct wmOperatorType *ot);
+void ED_view3d_operator_properties_viewmat_set(struct bContext *C, struct wmOperator *op);
+void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx, int *winy, float persmat[4][4]);
+
 #endif /* ED_VIEW3D_H */
index d79bc7d2974dfaa5b340a09da3b0e0e072351738..93cb0f8ae9768a117a0a66c8aceed5bc3fb6d3b5 100644 (file)
@@ -1529,38 +1529,40 @@ void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wc
                width= rect.xmax-rect.xmin+1;
                height = rect.ymax-rect.ymin;
 
-               zoomx= (float)width / (scopes->track_preview->x-2*margin);
-               zoomy= (float)height / (scopes->track_preview->y-2*margin);
+               if(width > 0 && height > 0) {
+                       zoomx= (float)width / (scopes->track_preview->x-2*margin);
+                       zoomy= (float)height / (scopes->track_preview->y-2*margin);
 
-               off_x= ((int)track_pos[0]-track_pos[0]+0.5)*zoomx;
-               off_y= ((int)track_pos[1]-track_pos[1]+0.5)*zoomy;
+                       off_x= ((int)track_pos[0]-track_pos[0]+0.5f)*zoomx;
+                       off_y= ((int)track_pos[1]-track_pos[1]+0.5f)*zoomy;
 
-               drawibuf= scale_trackpreview_ibuf(scopes->track_preview, track_pos, width, height, margin);
+                       drawibuf= scale_trackpreview_ibuf(scopes->track_preview, track_pos, width, height, margin);
 
-               glaDrawPixelsSafe(rect.xmin, rect.ymin+1, drawibuf->x, drawibuf->y,
-                                 drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect);
-               IMB_freeImBuf(drawibuf);
+                       glaDrawPixelsSafe(rect.xmin, rect.ymin+1, drawibuf->x, drawibuf->y,
+                                         drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect);
+                       IMB_freeImBuf(drawibuf);
 
-               /* draw cross for pizel position */
-               glTranslatef(off_x+rect.xmin+track_pos[0]*zoomx, off_y+rect.ymin+track_pos[1]*zoomy, 0.f);
-               glScissor(ar->winrct.xmin + rect.xmin, ar->winrct.ymin+rect.ymin, rect.xmax-rect.xmin, rect.ymax-rect.ymin);
+                       /* draw cross for pizel position */
+                       glTranslatef(off_x+rect.xmin+track_pos[0]*zoomx, off_y+rect.ymin+track_pos[1]*zoomy, 0.f);
+                       glScissor(ar->winrct.xmin + rect.xmin, ar->winrct.ymin+rect.ymin, rect.xmax-rect.xmin, rect.ymax-rect.ymin);
 
-               for(a= 0; a< 2; a++) {
-                       if(a==1) {
-                               glLineStipple(3, 0xaaaa);
-                               glEnable(GL_LINE_STIPPLE);
-                               UI_ThemeColor(TH_SEL_MARKER);
-                       }
-                       else {
-                               UI_ThemeColor(TH_MARKER_OUTLINE);
-                       }
+                       for(a= 0; a< 2; a++) {
+                               if(a==1) {
+                                       glLineStipple(3, 0xaaaa);
+                                       glEnable(GL_LINE_STIPPLE);
+                                       UI_ThemeColor(TH_SEL_MARKER);
+                               }
+                               else {
+                                       UI_ThemeColor(TH_MARKER_OUTLINE);
+                               }
 
-                       glBegin(GL_LINES);
-                               glVertex2f(-10.0f, 0.0f);
-                               glVertex2f(10.0f, 0.0f);
-                               glVertex2f(0.0f, -10.0f);
-                               glVertex2f(0.0f, 10.0f);
-                       glEnd();
+                               glBegin(GL_LINES);
+                                       glVertex2f(-10.0f, 0.0f);
+                                       glVertex2f(10.0f, 0.0f);
+                                       glVertex2f(0.0f, -10.0f);
+                                       glVertex2f(0.0f, 10.0f);
+                                       glEnd();
+                       }
                }
 
                glDisable(GL_LINE_STIPPLE);
index cfb375c25581af265689a7d8da77f75265aafe34..cadc57c9881c4304b0384ff8a8fa8bede0912fdf 100644 (file)
@@ -3607,31 +3607,6 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
 }
 
 
-static int verg_colorband(const void *a1, const void *a2)
-{
-       const CBData *x1=a1, *x2=a2;
-       
-       if( x1->pos > x2->pos ) return 1;
-       else if( x1->pos < x2->pos) return -1;
-       return WM_UI_HANDLER_CONTINUE;
-}
-
-static void ui_colorband_update(ColorBand *coba)
-{
-       int a;
-       
-       if(coba->tot<2) return;
-       
-       for(a=0; a<coba->tot; a++) coba->data[a].cur= a;
-               qsort(coba->data, coba->tot, sizeof(CBData), verg_colorband);
-       for(a=0; a<coba->tot; a++) {
-               if(coba->data[a].cur==coba->cur) {
-                       coba->cur= a;
-                       break;
-               }
-       }
-}
-
 static int ui_numedit_but_COLORBAND(uiBut *but, uiHandleButtonData *data, int mx)
 {
        float dx;
@@ -3644,7 +3619,7 @@ static int ui_numedit_but_COLORBAND(uiBut *but, uiHandleButtonData *data, int mx
        data->dragcbd->pos += dx;
        CLAMP(data->dragcbd->pos, 0.0f, 1.0f);
        
-       ui_colorband_update(data->coba);
+       colorband_update_sort(data->coba);
        data->dragcbd= data->coba->data + data->coba->cur;      /* because qsort */
        
        data->draglastx= mx;
index 8e336a363df887515dd55cda3f257c67dd8b37e1..360b58eb0a90287bfb755157677868e7f0c5a25e 100644 (file)
@@ -1541,6 +1541,8 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
                if(ELEM(but->type, BLOCK, PULLDOWN))
                        block->xofs = -2;       /* for proper alignment */
 
+               block->aspect = but->block->aspect;
+
                ui_block_position(window, butregion, but, block);
        }
        else {
index 4a8fba530b0501d96750bd9a38f958a2e43b0d72..9eefb469146a860b921e23be2d31b36ea8885e83 100644 (file)
@@ -1306,6 +1306,16 @@ static void colorband_flip_cb(bContext *C, void *cb_v, void *coba_v)
        rna_update_cb(C, cb_v, NULL);
 }
 
+static void colorband_update_cb(bContext *UNUSED(C), void *bt_v, void *coba_v)
+{
+       uiBut *bt= bt_v;
+       ColorBand *coba= coba_v;
+
+       /* sneaky update here, we need to sort the colorband points to be in order,
+          however the RNA pointer then is wrong, so we update it */
+       colorband_update_sort(coba);
+       bt->rnapoin.data = coba->data + coba->cur;
+}
 
 /* offset aligns from bottom, standard width 300, height 115 */
 static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand *coba, int xoffs, int yoffs, RNAUpdateCb *cb)
@@ -1349,7 +1359,11 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand
                PointerRNA ptr;
                RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
                row= uiLayoutRow(layout, 0);
+
                uiItemR(row, &ptr, "position", 0, "Pos", ICON_NONE);
+               bt= block->buttons.last;
+               uiButSetFunc(bt, colorband_update_cb, bt, coba);
+
                uiItemR(row, &ptr, "color", 0, "", ICON_NONE);
        }
 
@@ -2151,7 +2165,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
                Object *ob= (Object*)activeptr->data;
                Key *key= (Key*)itemptr->id.data;
 
-               split= uiLayoutSplit(sub, 0.75f, 0);
+               split= uiLayoutSplit(sub, 0.66f, 0);
 
                uiItemL(split, name, icon);
 
@@ -2159,10 +2173,13 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
                row= uiLayoutRow(split, 1);
                if(i == 0 || (key->type != KEY_RELATIVE)) uiItemL(row, "", ICON_NONE);
                else uiItemR(row, itemptr, "value", 0, "", ICON_NONE);
+               uiItemR(row, itemptr, "mute", 0, "", 0);
 
-               if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH))
+               if( (key->flag & KEYBLOCK_MUTE) ||
+                   (ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH)) )
+               {
                        uiLayoutSetActive(row, 0);
-               //uiItemR(row, itemptr, "mute", 0, "", ICON_MUTE_IPO_OFF);
+               }
                uiBlockSetEmboss(block, UI_EMBOSS);
        }
        else if(itemptr->type == &RNA_VertexGroup) {
index d9854ea76782b4f246954bc05d1051bf6bdd9eee..016953315421b821ffd031bb7ba9ae88221be494 100644 (file)
@@ -288,11 +288,17 @@ static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct
 /* for amount of edges */
 #define MAX_CUT_EDGES 1024
 
+static int knife_cut_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       ED_view3d_operator_properties_viewmat_set(C, op);
+
+       return WM_gesture_lines_invoke(C, op, event);
+}
+
 static int knife_cut_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
-       ARegion *ar= CTX_wm_region(C);
        EditEdge *eed;
        EditVert *eve;
        CutCurve curve[MAX_CUT_EDGES];
@@ -302,10 +308,12 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
        int len=0;
        short numcuts= RNA_int_get(op->ptr, "num_cuts"); 
        short mode= RNA_enum_get(op->ptr, "type");
+       int winx, winy;
+       float persmat[4][4];
 //     int corner_cut_pattern= RNA_enum_get(op->ptr,"corner_cut_pattern");
        
        /* edit-object needed for matrix, and ar->regiondata for projections to work */
-       if (ELEM3(NULL, obedit, ar, ar->regiondata))
+       if (obedit == NULL)
                return OPERATOR_CANCELLED;
        
        if (EM_nvertices_selected(em) < 2) {
@@ -328,6 +336,8 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
+       ED_view3d_operator_properties_viewmat_get(op, &winx, &winy, persmat);
+
        /*store percentage of edge cut for KNIFE_EXACT here.*/
        for(eed=em->edges.first; eed; eed= eed->next) 
                eed->tmp.fp = 0.0; 
@@ -339,7 +349,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
                VECCOPY(co, eve->co);
                co[3]= 1.0;
                mul_m4_v4(obedit->obmat, co);
-               project_float(ar, co, scr);
+               apply_project_float(persmat, winx, winy, co, scr);
                BLI_ghash_insert(gh, eve, scr);
                eve->f1 = 0; /*store vertex intersection flag here*/
        
@@ -390,7 +400,7 @@ void MESH_OT_knife_cut(wmOperatorType *ot)
        ot->description= "Cut selected edges and faces into parts";
        ot->idname= "MESH_OT_knife_cut";
        
-       ot->invoke= WM_gesture_lines_invoke;
+       ot->invoke= knife_cut_invoke;
        ot->modal= WM_gesture_lines_modal;
        ot->exec= knife_cut_exec;
        ot->cancel= WM_gesture_lines_cancel;
@@ -407,7 +417,10 @@ void MESH_OT_knife_cut(wmOperatorType *ot)
        // doesn't work atm.. RNA_def_enum(ot->srna, "corner_cut_pattern", corner_type_items, SUBDIV_CORNER_INNERVERT, "Corner Cut Pattern", "Topology pattern to use to fill a face after cutting across its corner");
        
        /* internal */
-       RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
+       prop = RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
+       RNA_def_property_flag(prop, PROP_HIDDEN);
+
+       ED_view3d_operator_properties_viewmat(ot);
 }
 
 /* ******************************************************* */
index d752d90ffdd9e802b3f3854daaa009223c5ed219..b10fbaf69b74ce21e566c13dcee7954656ccfec2 100644 (file)
@@ -183,7 +183,7 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
 
                layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
                if(layernum >= MAX_MTFACE)
-                       return 0;
+                       return -1;
 
                EM_add_data_layer(em, &em->fdata, CD_MTFACE, name);
 
@@ -196,7 +196,7 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
        else {
                layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
                if(layernum >= MAX_MTFACE)
-                       return 0;
+                       return -1;
 
                if(me->mtface)
                        CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name);
@@ -212,7 +212,7 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
        DAG_id_tag_update(&me->id, 0);
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
 
-       return 1;
+       return layernum;
 }
 
 int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
@@ -244,7 +244,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes
 
                layernum= CustomData_number_of_layers(&em->fdata, CD_MCOL);
                if(layernum >= MAX_MCOL)
-                       return 0;
+                       return -1;
 
                EM_add_data_layer(em, &em->fdata, CD_MCOL, name);
 
@@ -257,7 +257,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes
        else {
                layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL);
                if(layernum >= MAX_MCOL)
-                       return 0;
+                       return -1;
 
                if(me->mcol)
                        CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface, name);
@@ -273,7 +273,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes
        DAG_id_tag_update(&me->id, 0);
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
 
-       return 1;
+       return layernum;
 }
 
 int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
@@ -328,7 +328,7 @@ static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob= ED_object_context(C);
        Mesh *me= ob->data;
 
-       if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE))
+       if(ED_mesh_uv_texture_add(C, me, NULL, TRUE) == -1)
                return OPERATOR_CANCELLED;
 
        return OPERATOR_FINISHED;
@@ -467,7 +467,7 @@ static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob= ED_object_context(C);
        Mesh *me= ob->data;
 
-       if(!ED_mesh_color_add(C, scene, ob, me, NULL, TRUE))
+       if(ED_mesh_color_add(C, scene, ob, me, NULL, TRUE) == -1)
                return OPERATOR_CANCELLED;
 
        return OPERATOR_FINISHED;
index 2fe2e71f2d95457ede8fcdba0f2a318a14785a94..d325b49c21124fdf915ac10cff385f13f4cb8aca 100644 (file)
@@ -1001,6 +1001,7 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
                DerivedMesh *cddm= CDDM_from_mesh(me, ob);
 
                tmp_mmd.lvl= *lvl;
+               tmp_mmd.sculptlvl= *lvl;
                dm= multires_dm_create_from_derived(&tmp_mmd, 1, cddm, ob, 0, 0);
                cddm->release(cddm);
        }
index 2797c08e72bc15d0c17a99de17877aa91b66ed4b..ed5899d81a822991a29f59f5ef7818227931d3c4 100644 (file)
@@ -536,7 +536,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
                int numVerts;
                float (*vertexCos)[3];
 
-               if (mti->type==eModifierTypeType_Constructive) {
+               if (ELEM(mti->type, eModifierTypeType_Constructive, eModifierTypeType_Nonconstructive)) {
                        BKE_report(reports, RPT_ERROR, "Cannot apply constructive modifiers on curve");
                        return 0;
                }
index dbc153de108ae55e8fa43673ebc4e45e1cfca85a..c528d8cd0783f16b4f67006bbc6b82e0c83a3b1b 100644 (file)
@@ -109,7 +109,7 @@ static float get_fluid_viscosity(FluidsimSettings *settings)
                        return 2.0e-3;
                case 1:         /* manual */
                default:
-                       return (1.0/pow(10.0, settings->viscosityExponent)) * settings->viscosityValue;
+                       return (1.0f/powf(10.0f, settings->viscosityExponent)) * settings->viscosityValue;
        }
 }
 
index a5b79d0c9741c83891de6e0034c5f37dceec4523..b8b36954e22b1b3f340913cbb9606f9e790c9a47 100644 (file)
@@ -474,7 +474,6 @@ static void image_undo_restore(bContext *C, ListBase *lb)
                }
 
                ibuf= BKE_image_get_ibuf(ima, NULL);
-               use_float = ibuf->rect_float ? 1 : 0;
 
                if(ima && ibuf && strcmp(tile->ibufname, ibuf->name)!=0) {
                        /* current ImBuf filename was changed, probably current frame
@@ -491,6 +490,8 @@ static void image_undo_restore(bContext *C, ListBase *lb)
                if (ima->gen_type != tile->gen_type || ima->source != tile->source)
                        continue;
 
+               use_float = ibuf->rect_float ? 1 : 0;
+
                if (use_float != tile->use_float)
                        continue;
 
index ce84e43955b642a243f20483446d486800ace15f..d05582512ae6df4d0273d5e73fbb7d4fa683f61a 100644 (file)
@@ -3153,7 +3153,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob,
                dx = cache->mouse[0] - cache->initial_mouse[0];
                dy = cache->mouse[1] - cache->initial_mouse[1];
 
-               cache->vertex_rotation = -atan2(dx, dy) * cache->bstrength;
+               cache->vertex_rotation = -atan2f(dx, dy) * cache->bstrength;
 
                sd->draw_anchored = 1;
                copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
index b1a25d093d2cebc6d45e0d4d9dfdfbadeeeb3479..26516bcda990626c3fc96ab6084fce964bfadadc 100644 (file)
@@ -43,6 +43,7 @@
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
+#include "BKE_report.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -160,6 +161,11 @@ static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event)
        FileBrowseOp *fbo;
        char *str;
 
+       if (CTX_wm_space_file(C)) {
+               BKE_report(op->reports, RPT_ERROR, "Can't activate a file selector, one already open");
+               return OPERATOR_CANCELLED;
+       }
+
        uiFileBrowseContextProperty(C, &ptr, &prop);
 
        if(!prop)
index 6a56de266899c02dbba282b2804859307018d220..f902422ab4395ee9d7788645fae3c6669635cf90 100644 (file)
@@ -450,7 +450,7 @@ void CLIP_OT_graph_view_all(wmOperatorType *ot)
 void ED_clip_graph_center_current_frame(Scene *scene, ARegion *ar)
 {
        View2D *v2d = &ar->v2d;
-       float extra = (v2d->cur.xmax - v2d->cur.xmin) / 2.0;
+       float extra = (v2d->cur.xmax - v2d->cur.xmin) / 2.0f;
 
        /* set extents of view to start/end frames */
        v2d->cur.xmin = (float)CFRA - extra;
index 5053379d37650efd4799d081ea520192ffaca78a..5d0f294b06a87fd251d2763cda29f92aef8cdeaa 100644 (file)
@@ -834,6 +834,27 @@ static void proxy_freejob(void *pjv)
        MEM_freeN(pj);
 }
 
+static int proxy_bitflag_to_array(int size_flag, int build_sizes[4], int undistort)
+{
+       int build_count = 0;
+       int size_flags[2][4] = {{MCLIP_PROXY_SIZE_25,
+                                MCLIP_PROXY_SIZE_50,
+                             MCLIP_PROXY_SIZE_75,
+                             MCLIP_PROXY_SIZE_100},
+                            {MCLIP_PROXY_UNDISTORTED_SIZE_25,
+                             MCLIP_PROXY_UNDISTORTED_SIZE_50,
+                             MCLIP_PROXY_UNDISTORTED_SIZE_75,
+                             MCLIP_PROXY_UNDISTORTED_SIZE_100}};
+       int size_nr = undistort ? 1 : 0;
+
+       if(size_flag & size_flags[size_nr][0]) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_25;
+       if(size_flag & size_flags[size_nr][1]) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_50;
+       if(size_flag & size_flags[size_nr][2]) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_75;
+       if(size_flag & size_flags[size_nr][3]) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_100;
+
+       return build_count;
+}
+
 /* only this runs inside thread */
 static void proxy_startjob(void *pjv, short *stop, short *do_update, float *progress)
 {
@@ -841,22 +862,23 @@ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *prog
        Scene *scene=pj->scene;
        MovieClip *clip= pj->clip;
        struct MovieDistortion *distortion= NULL;
-       int cfra, undistort;
-       short tc_flag, size_flag, quality, build_flag;
-       int sfra= SFRA, efra= EFRA;
+       short tc_flag, size_flag, quality;
+       int cfra, sfra= SFRA, efra= EFRA;
        int build_sizes[4], build_count= 0;
+       int build_undistort_sizes[4], build_undistort_count= 0;
 
        tc_flag= clip->proxy.build_tc_flag;
        size_flag= clip->proxy.build_size_flag;
        quality= clip->proxy.quality;
-       build_flag= clip->proxy.build_flag;
-       undistort= build_flag&MCLIP_PROXY_RENDER_UNDISTORT;
+
+       build_count= proxy_bitflag_to_array(size_flag, build_sizes, 0);
+       build_undistort_count= proxy_bitflag_to_array(size_flag, build_undistort_sizes, 1);
 
        if(clip->source == MCLIP_SRC_MOVIE) {
                if(clip->anim)
                        IMB_anim_index_rebuild(clip->anim, tc_flag, size_flag, quality, stop, do_update, progress);
 
-               if(!undistort) {
+               if(!build_undistort_count) {
                        return;
                }
                else {
@@ -865,20 +887,14 @@ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *prog
                }
        }
 
-       if(size_flag&IMB_PROXY_25) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_25;
-       if(size_flag&IMB_PROXY_50) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_50;
-       if(size_flag&IMB_PROXY_75) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_75;
-       if(size_flag&IMB_PROXY_100) build_sizes[build_count++]= MCLIP_PROXY_RENDER_SIZE_100;
-
-       if(undistort)
+       if(build_undistort_count)
                distortion= BKE_tracking_distortion_create();
 
        for(cfra= sfra; cfra<=efra; cfra++) {
                if(clip->source != MCLIP_SRC_MOVIE)
                        BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, NULL, cfra, build_sizes, build_count, 0);
 
-               if(undistort)
-                       BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, distortion, cfra, build_sizes, build_count, 1);
+               BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, distortion, cfra, build_undistort_sizes, build_undistort_count, 1);
 
                if(*stop || G.afbreek)
                        break;
index f21b50ec5924c7bc7d8d570d38ed1891e540380a..6a9c2755330bab5fe0b09a068a75f42f7abcb20a 100644 (file)
@@ -2757,7 +2757,7 @@ static int detect_features_exec(bContext *C, wmOperator *op)
        SpaceClip *sc= CTX_wm_space_clip(C);
        MovieClip *clip= ED_space_clip(sc);
        int clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
-       ImBuf *ibuf= BKE_movieclip_get_ibuf_flag(clip, &sc->user, clip_flag);
+       ImBuf *ibuf= BKE_movieclip_get_ibuf_flag(clip, &sc->user, clip_flag, MOVIECLIP_CACHE_SKIP);
        MovieTracking *tracking= &clip->tracking;
        ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
        MovieTrackingTrack *track= tracksbase->first;
@@ -3417,15 +3417,15 @@ static int clean_tracks_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even
 {
        SpaceClip *sc= CTX_wm_space_clip(C);
        MovieClip *clip= ED_space_clip(sc);
-       int frames= RNA_int_get(op->ptr, "frames");
-       float error= RNA_float_get(op->ptr, "error");
-       int action= RNA_enum_get(op->ptr, "action");
 
-       if(frames==0 && error==0 && action==0) {
+       if(!RNA_struct_property_is_set(op->ptr, "frames"))
                RNA_int_set(op->ptr, "frames", clip->tracking.settings.clean_frames);
+
+       if(!RNA_struct_property_is_set(op->ptr, "error"))
                RNA_float_set(op->ptr, "error", clip->tracking.settings.clean_error);
+
+       if(!RNA_struct_property_is_set(op->ptr, "action"))
                RNA_enum_set(op->ptr, "action", clip->tracking.settings.clean_action);
-       }
 
        return clean_tracks_exec(C, op);
 }
index daa2031bb5f72e6196d79840cb9be35b93f7c5e7..8a5f5c1427eb9f3d27d0e2305e30e7cf7a65b8d5 100644 (file)
@@ -1096,8 +1096,14 @@ static void file_expand_directory(bContext *C)
                        BLI_join_dirfile(sfile->params->dir, sizeof(sfile->params->dir), BLI_getDefaultDocumentFolder(), tmpstr);
                }
 
-#ifdef WIN32
-               if (sfile->params->dir[0] == '\0') {
+               else if (sfile->params->dir[0] == '\0')
+#ifndef WIN32
+               {
+                       sfile->params->dir[0] = '/';
+                       sfile->params->dir[1] = '\0';
+               }
+#else
+               {
                        get_default_root(sfile->params->dir);
                }
                /* change "C:" --> "C:\", [#28102] */
index 71f0917a4f3ea1b42b0c19fb6d8898430113c7fa..fe734e53651cf0c514766ba3cc2452c0535dcbde 100644 (file)
@@ -855,14 +855,13 @@ static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e
        SpaceNode *snode = CTX_wm_space_node(C);
        bNode *gnode;
        
-       gnode = nodeGetActive(snode->edittree);
-       if (!gnode)
-               return OPERATOR_CANCELLED;
-       
        /* XXX callback? */
-       if(gnode && gnode->id && GS(gnode->id->name)==ID_NT && gnode->id->lib) {
-               uiPupMenuOkee(C, op->type->idname, "Make group local?");
-               return OPERATOR_CANCELLED;
+       if (snode->nodetree==snode->edittree) {
+               gnode = nodeGetActive(snode->edittree);
+               if(gnode && gnode->id && GS(gnode->id->name)==ID_NT && gnode->id->lib) {
+                       uiPupMenuOkee(C, op->type->idname, "Make group local?");
+                       return OPERATOR_CANCELLED;
+               }
        }
 
        return node_group_edit_exec(C, op);
index 511f1524fae3a0662e26dd467316d405fd6a5828..7bc8600c11cfbc3d4fc5b76cac7dcb137dee4ec2 100644 (file)
@@ -553,7 +553,10 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float
                        BLI_snprintf(str, sizeof(str), "%d | %s", seq->len, name);
        }
        else if (seq->type == SEQ_SOUND) {
-               BLI_snprintf(str, sizeof(str), "%d | %s: %s", seq->len, name, seq->sound->name);
+               if(seq->sound)
+                       BLI_snprintf(str, sizeof(str), "%d | %s: %s", seq->len, name, seq->sound->name);
+               else
+                       BLI_snprintf(str, sizeof(str), "%d | %s", seq->len, name);
        }
        else if (seq->type == SEQ_MOVIE) {
                BLI_snprintf(str, sizeof(str), "%d | %s: %s%s", seq->len, name, seq->strip->dir, seq->strip->stripdata->name);
index 2bb40ce51f44e79c064cfc97d095edafd987b08f..c13a5202c19615eac0cfc6a5759fbdbc3250e710 100644 (file)
@@ -170,7 +170,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
 
                for (x = 0; x < ibuf->x; x++) {
                        unsigned char * rgb = src + 4 * (ibuf->x * y + x);
-                       float v = (float)rgb_to_luma_byte(rgb) / 255.0;
+                       float v = (float)rgb_to_luma_byte(rgb) / 255.0f;
                        unsigned char * p = tgt;
                        p += 4 * (w * ((int) (v * (h - 3)) + 1) + x + 1);
 
index 1b94c9152b884f4f4fe13e7d9991fe9706997478..8fc2f17fae402714ab37bfc1f4497e41e61248b1 100644 (file)
@@ -4068,7 +4068,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
        ParticleDrawData *pdd = psys->pdd;
        Material *ma;
        float vel[3], imat[4][4];
-       float timestep, pixsize=1.0, pa_size, r_tilt, r_length;
+       float timestep, pixsize_scale, pa_size, r_tilt, r_length;
        float pa_time, pa_birthtime, pa_dietime, pa_health, intensity;
        float cfra;
        float ma_col[3]= {0.0f, 0.0f, 0.0f};
@@ -4175,12 +4175,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                case PART_DRAW_CROSS:
                case PART_DRAW_AXIS:
                        /* lets calculate the scale: */
-                       pixsize= ED_view3d_pixel_size(rv3d, ob->obmat[3]);
                        
-                       if(part->draw_size==0.0)
-                               pixsize *= 2.0f;
+                       if (part->draw_size == 0.0)
+                               pixsize_scale = 2.0f;
                        else
-                               pixsize*=part->draw_size;
+                               pixsize_scale = part->draw_size;
 
                        if(draw_as==PART_DRAW_AXIS)
                                create_cdata = 1;
@@ -4368,6 +4367,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
 
                                ct+=dt;
                                for(i=0; i < trail_count; i++, ct += dt) {
+                                       float pixsize;
+
                                        if(part->draw & PART_ABS_PATH_TIME) {
                                                if(ct < pa_birthtime || ct > pa_dietime)
                                                        continue;
@@ -4401,6 +4402,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                                                bb.time = ct;
                                        }
 
+                                       pixsize = ED_view3d_pixel_size(rv3d, state.co) * pixsize_scale;
+
                                        draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, psys->pdd);
 
                                        totpoint++;
@@ -4411,6 +4414,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                        {
                                state.time=cfra;
                                if(psys_get_particle_state(&sim,a,&state,0)){
+                                       float pixsize;
+
                                        if(psys->parent)
                                                mul_m4_v3(psys->parent->obmat, state.co);
 
@@ -4434,6 +4439,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                                                bb.time = pa_time;
                                        }
 
+                                       pixsize = ED_view3d_pixel_size(rv3d, state.co) * pixsize_scale;
+
                                        draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, pdd);
 
                                        totpoint++;
index f57d8a5ec1b25224192cf3ad059ff57a096fac81..1a2e893241183ed4ecce9a0fd0059fa106e52866 100644 (file)
@@ -68,6 +68,9 @@
 #include "BL_System.h"
 #endif
 
+#include "RNA_access.h"
+#include "RNA_define.h"
+
 #include "view3d_intern.h"     // own include
 
 /* use this call when executing an operator,
@@ -947,23 +950,29 @@ void project_short_noclip(ARegion *ar, const float vec[3], short adr[2])
        }
 }
 
-void project_float(ARegion *ar, const float vec[3], float adr[2])
+void apply_project_float(float persmat[4][4], int winx, int winy, const float vec[3], float adr[2])
 {
-       RegionView3D *rv3d= ar->regiondata;
        float vec4[4];
-       
+
        copy_v3_v3(vec4, vec);
        vec4[3]= 1.0;
        adr[0]= IS_CLIPPED;
-       
-       mul_m4_v4(rv3d->persmat, vec4);
-       
+
+       mul_m4_v4(persmat, vec4);
+
        if(vec4[3] > (float)BL_NEAR_CLIP) {
-               adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
-               adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
+               adr[0] = (float)(winx/2.0f)+(winx/2.0f)*vec4[0]/vec4[3];
+               adr[1] = (float)(winy/2.0f)+(winy/2.0f)*vec4[1]/vec4[3];
        }
 }
 
+void project_float(ARegion *ar, const float vec[3], float adr[2])
+{
+       RegionView3D *rv3d= ar->regiondata;
+
+       apply_project_float(rv3d->persmat, ar->winx, ar->winy, vec, adr);
+}
+
 void project_float_noclip(ARegion *ar, const float vec[3], float adr[2])
 {
        RegionView3D *rv3d= ar->regiondata;
@@ -1854,3 +1863,42 @@ float ED_view3d_pixel_size(struct RegionView3D *rv3d, const float co[3])
                                rv3d->persmat[2][3]*co[2])
                        ) * rv3d->pixsize;
 }
+
+/* view matrix properties utilities */
+
+void ED_view3d_operator_properties_viewmat(wmOperatorType *ot)
+{
+       PropertyRNA *prop;
+
+       prop = RNA_def_int(ot->srna, "region_width", 0, 0, INT_MAX, "Region Width", "", 0, INT_MAX);
+       RNA_def_property_flag(prop, PROP_HIDDEN);
+
+       prop = RNA_def_int(ot->srna, "region_height", 0, 0, INT_MAX, "Region height", "", 0, INT_MAX);
+       RNA_def_property_flag(prop, PROP_HIDDEN);
+
+       prop = RNA_def_float_matrix(ot->srna, "perspective_matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Perspective Matrix", 0.0f, 0.0f);
+       RNA_def_property_flag(prop, PROP_HIDDEN);
+}
+
+void ED_view3d_operator_properties_viewmat_set(bContext *C, wmOperator *op)
+{
+       ARegion *ar= CTX_wm_region(C);
+       RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+
+       if(!RNA_struct_property_is_set(op->ptr, "region_width"))
+               RNA_int_set(op->ptr, "region_width", ar->winx);
+
+       if(!RNA_struct_property_is_set(op->ptr, "region_height"))
+               RNA_int_set(op->ptr, "region_height", ar->winy);
+
+       if(!RNA_struct_property_is_set(op->ptr, "perspective_matrix"))
+               RNA_float_set_array(op->ptr, "perspective_matrix", (float *)rv3d->persmat);
+}
+
+void ED_view3d_operator_properties_viewmat_get(wmOperator *op, int *winx, int *winy, float persmat[4][4])
+{
+       *winx = RNA_int_get(op->ptr, "region_width");
+       *winy = RNA_int_get(op->ptr, "region_height");
+
+       RNA_float_get_array(op->ptr, "perspective_matrix", (float *)persmat);
+}
index 1e1f6e4279ea744486eae6b4283c53ce770eb968..15bd14ce94c8de4a7db21048366bc8ce46ab9e0c 100644 (file)
@@ -5566,9 +5566,9 @@ static void headerTimeTranslate(TransInfo *t, char *str)
                /* apply snapping + frame->seconds conversions */
                if (autosnap == SACTSNAP_STEP) {
                        if (doTime)
-                               val= floor((double)val/secf + 0.5f);
+                               val= floorf((double)val/secf + 0.5f);
                        else
-                               val= floor(val + 0.5f);
+                               val= floorf(val + 0.5f);
                }
                else {
                        if (doTime)
index 0563cc3adf5cd9e55f4d1e1fd24600f5bc550ff5..86b5ab9421b2cfefcc0114800976202bb1467ad4 100644 (file)
@@ -2303,12 +2303,17 @@ void flushTransSeq(TransInfo *t)
 
        if (ELEM(t->mode, TFM_SEQ_SLIDE, TFM_TIME_TRANSLATE)) { /* originally TFM_TIME_EXTEND, transform changes */
                /* Special annoying case here, need to calc metas with TFM_TIME_EXTEND only */
-               seq= seqbasep->first;
 
-               while(seq) {
-                       if (seq->type == SEQ_META && seq->flag & SELECT)
+               /* calc all meta's then effects [#27953] */
+               for (seq = seqbasep->first; seq; seq = seq->next) {
+                       if (seq->type == SEQ_META && seq->flag & SELECT) {
                                calc_sequence(t->scene, seq);
-                       seq= seq->next;
+                       }
+               }
+               for (seq = seqbasep->first; seq; seq = seq->next) {
+                       if (seq->seq1 || seq->seq2 || seq->seq3) {
+                               calc_sequence(t->scene, seq);
+                       }
                }
        }
 
@@ -5640,10 +5645,13 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip(sc);
 
-       if(!clip || !BKE_movieclip_has_frame(clip, &sc->user)) {
-               t->total = 0;
+       t->total = 0;
+
+       if(!clip || !BKE_movieclip_has_frame(clip, &sc->user))
+               return;
+
+       if(!ELEM(t->mode, TFM_RESIZE, TFM_TRANSLATION))
                return;
-       }
 
        if(ar->regiontype == RGN_TYPE_PREVIEW) {
                /* transformation was called from graph editor */
index 2241c0182fac47e1e2d0e023954dac22d18d1408..4683d4f721f88289220fdb954a054c0902c36196 100644 (file)
@@ -1230,6 +1230,11 @@ void mtex_bump_tap3( vec3 texco, sampler2D ima, float hScale,
 void mtex_bump_bicubic( vec3 texco, sampler2D ima, float hScale, 
                      out float dBs, out float dBt ) 
 {
+       float Hl;
+       float Hr;
+       float Hd;
+       float Hu;
+       
        vec2 TexDx = dFdx(texco.xy);
        vec2 TexDy = dFdy(texco.xy);
  
@@ -1238,10 +1243,10 @@ void mtex_bump_bicubic( vec3 texco, sampler2D ima, float hScale,
        vec2 STd = texco.xy - 0.5 * TexDy ;
        vec2 STu = texco.xy + 0.5 * TexDy ;
        
-       float Hl = texture2D(ima, STl).x;
-       float Hr = texture2D(ima, STr).x;
-       float Hd = texture2D(ima, STd).x;
-       float Hu = texture2D(ima, STu).x;
+       rgbtobw(texture2D(ima, STl), Hl);
+       rgbtobw(texture2D(ima, STr), Hr);
+       rgbtobw(texture2D(ima, STd), Hd);
+       rgbtobw(texture2D(ima, STu), Hu);
        
        vec2 dHdxy = vec2(Hr - Hl, Hu - Hd);
        float fBlend = clamp(1.0-textureQueryLOD(ima, texco.xy).x, 0.0, 1.0);
@@ -1251,12 +1256,14 @@ void mtex_bump_bicubic( vec3 texco, sampler2D ima, float hScale,
                ivec2 vDim;
                vDim = textureSize(ima, 0);
 
-               vec2 fTexLoc = vDim*texco.xy-vec2(0.5,0.5);
+               // taking the fract part of the texture coordinate is a hardcoded wrap mode.
+               // this is acceptable as textures use wrap mode exclusively in 3D view elsewhere in blender. 
+               // this is done so that we can still get a valid texel with uvs outside the 0,1 range
+               // by texelFetch below, as coordinates are clamped when using this function.
+               vec2 fTexLoc = vDim*fract(texco.xy) - vec2(0.5, 0.5);
                ivec2 iTexLoc = ivec2(floor(fTexLoc));
                vec2 t = clamp(fTexLoc - iTexLoc, 0.0, 1.0);            // sat just to be pedantic
 
-               ivec2 iTexLocMod = iTexLoc + ivec2(-1, -1);
-
 /*******************************************************************************************
  * This block will replace the one below when one channel textures are properly supported. *
  *******************************************************************************************
@@ -1264,17 +1271,26 @@ void mtex_bump_bicubic( vec3 texco, sampler2D ima, float hScale,
                vec4 vSamplesUR = textureGather(ima, (iTexLoc+ivec2(1,-1) + vec2(0.5,0.5))/vDim );
                vec4 vSamplesLL = textureGather(ima, (iTexLoc+ivec2(-1,1) + vec2(0.5,0.5))/vDim );
                vec4 vSamplesLR = textureGather(ima, (iTexLoc+ivec2(1,1) + vec2(0.5,0.5))/vDim );
-               
+
                mat4 H = mat4(vSamplesUL.w, vSamplesUL.x, vSamplesLL.w, vSamplesLL.x,
                                        vSamplesUL.z, vSamplesUL.y, vSamplesLL.z, vSamplesLL.y,
                                        vSamplesUR.w, vSamplesUR.x, vSamplesLR.w, vSamplesLR.x,
                                        vSamplesUR.z, vSamplesUR.y, vSamplesLR.z, vSamplesLR.y);
 */     
+               ivec2 iTexLocMod = iTexLoc + ivec2(-1, -1);
+
                mat4 H;
                
                for(int i = 0; i < 4; i++){
                        for(int j = 0; j < 4; j++){
-                               mtex_rgbtoint(texelFetch(ima, (iTexLocMod + ivec2(i,j)), 0), H[i][j]);
+                               ivec2 iTexTmp = iTexLocMod + ivec2(i,j);
+                               
+                               // wrap texture coordinates manually for texelFetch to work on uvs oitside the 0,1 range.
+                               // this is guaranteed to work since we take the fractional part of the uv above.
+                               iTexTmp.x = (iTexTmp.x < 0)? iTexTmp.x + vDim.x : ((iTexTmp.x >= vDim.x)? iTexTmp.x - vDim.x : iTexTmp.x);
+                               iTexTmp.y = (iTexTmp.y < 0)? iTexTmp.y + vDim.y : ((iTexTmp.y >= vDim.y)? iTexTmp.y - vDim.y : iTexTmp.y);
+
+                               rgbtobw(texelFetch(ima, iTexTmp, 0), H[i][j]);
                        }
                }
                
index 8ddb7bb5b9513ed1b7279f7f5bfbcfe814e4a3c1..0f4ea048ea8ab0da9498492908b1412abe3dbf32 100644 (file)
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 49753;
+int datatoc_gpu_shader_material_glsl_size= 52820;
 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,
- 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48,
- 54, 57, 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,118, 99,111,108, 95, 97,108,112,104, 97, 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,118, 99,111,108, 95, 97,
-108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 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, 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,
-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,
+ 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13,
+ 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, 13, 10,  9,118,101, 99, 51, 32, 99, 59, 13, 10, 13, 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, 13, 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, 13, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 13, 10, 13, 10,
+  9,118, 32, 61, 32, 99,109, 97,120, 59, 13, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 13, 10,  9,  9,115,
+ 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 13, 10,  9,101,108,115,101, 32,123, 13, 10,  9,  9,115, 32, 61, 32,
+ 48, 46, 48, 59, 13, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,125, 13, 10, 13, 10,  9,105,102, 32, 40,115, 32, 61,
+ 61, 32, 48, 46, 48, 41, 32,123, 13, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,125, 13, 10,  9,101,108,115,101, 32,
+123, 13, 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, 13, 10, 13, 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, 13, 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, 13, 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, 13, 10, 13, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 13, 10, 13, 10,  9,  9,105,
+102, 32, 40,104, 60, 48, 46, 48, 41, 13, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 13, 10,  9,125, 13, 10, 13, 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, 13, 10,
+125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,  9,118,101, 99, 51, 32,114,103, 98, 59, 13, 10,
+ 13, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 13, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 13, 10,  9,118,
+ 32, 61, 32,104,115,118, 91, 50, 93, 59, 13, 10, 13, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 13, 10,  9,  9,114,
+103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 13, 10,  9,125, 13, 10,  9,101,108,115,101, 32,123,
+ 13, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 13, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,  9, 13,
+ 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59, 13, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 13, 10,  9,
+  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 13, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,
+102, 41, 59, 13, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 13, 10,  9,  9,113, 32, 61, 32,118, 42, 40,
+ 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 13, 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, 13, 10,  9,  9, 13, 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, 13, 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, 13, 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, 13, 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, 13, 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, 13, 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, 13, 10,  9,125, 13, 10,
+ 13, 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, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 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, 13, 10,125, 13, 10, 13, 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, 13,
+ 10,123, 13, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 13, 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, 13, 10,  9,101,108,
+115,101, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 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, 13, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,
+111,108, 95,102,114,111,109, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 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, 13, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,
+102,114,111,109, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80,
+ 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 13, 10, 13, 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, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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,118, 99,111,108, 95, 97,108,112,104, 97,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 13, 10,123, 13, 10,  9,108,111, 99, 97,
+108, 32, 61, 32, 99,111, 59, 13, 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, 13, 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, 13, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,
+111, 59, 13, 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, 13, 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,
+ 13, 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, 13, 10,  9,118, 99,111,108, 95, 97,108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 59, 13, 10,  9,102,114,
+111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,  9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10,  9,105,102, 40,100,111,
+109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10,125, 13, 10, 13, 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,
+ 13, 10,123, 13, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 13, 10,  9,111,117,
+116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32,
+ 43, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,
+118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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,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,
+ 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,
+108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 13, 10,  9,  9,111,117,
+116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118,
+ 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123,
+ 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41,
+ 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118,
+ 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 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,
+ 13, 10,123, 13, 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, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 13, 10,  9,101,108,
+115,101, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59,
+ 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,
+108, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,
+117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116,118,
+ 97,108, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,105,102,
+ 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 13, 10,
+  9,101,108,115,101, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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,
+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, 13, 10,123,
+ 13, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49,
+ 46, 48, 59, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10,
+ 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118,101,
+ 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13,
+ 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 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,110,111,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, 50, 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, 50, 68, 40,
- 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53,
- 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
+118, 97,108, 41, 13, 10,123, 13, 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, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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,
+ 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118,
+ 41, 59, 13, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 13, 10,125, 13, 10,
+ 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,110,111,114, 32, 61, 32,110,111,114, 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 50, 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, 13, 10,123, 13, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,
+117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44,
+ 32, 48, 46, 48, 41, 41, 46,120, 59, 13, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
  40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
- 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 50,
- 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48,
- 46, 53, 44, 32, 48, 46, 48, 41, 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, 50, 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, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,
-101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32, 48,
- 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,
-116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40,
- 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48,
- 46, 48, 41, 41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,
-114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44,
- 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 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, 99,
-111,112,121, 95,114, 97,119, 40,118,101, 99, 52, 32,118, 97,108, 44, 32,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, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,112,121,
- 95,114, 97,119, 40,118,101, 99, 51, 32,118, 97,108, 44, 32,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, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,
-119, 40,118,101, 99, 50, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 50, 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, 99,111,112,121, 95,114, 97,119, 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,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,
+ 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 13, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101,
+ 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42,
+ 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 13, 10, 13, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48,
+ 41, 13, 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, 13, 10, 13, 10,125, 13, 10, 13, 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, 50, 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, 13,
+ 10,123, 13, 10,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109,
+ 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99,
+ 50, 40, 99,111,108, 46,114, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 13, 10,  9,111,117,116,
+ 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50,
+ 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44,
+ 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,103, 59, 13, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
+116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101,
+ 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97,
+ 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 13, 10, 13, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59,
+ 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61,
+ 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116, 99,111,108, 32,
+ 61, 32, 99,111,108, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116, 99,111,
+108, 32, 61, 32, 99,111,108, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108,
+ 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61,
+ 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99,
+ 51, 40, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,
+118,101, 99, 52, 40, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,118,
+101, 99, 52, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10,  9,111,
+117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,119,
+ 40,118,101, 99, 51, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10,
+  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, 99,111,112,121, 95,114,
+ 97,119, 40,118,101, 99, 50, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 50, 32,111,117,116,118, 97,108, 41, 13, 10,123,
+ 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, 99,111,112,121,
+ 95,114, 97,119, 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, 13, 10,123, 13, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,
+111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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,
+ 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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,
+ 41, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 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, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108,
+ 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10,  9,
+105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13,
+ 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, 13, 10, 13, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 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, 13, 10, 13, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32,
+ 60, 32, 48, 46, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 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, 13, 10,125, 13, 10, 13, 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, 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,
+ 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, 13, 10,
+123, 13, 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, 13,
+ 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, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13,
+ 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 10,
+  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 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, 13, 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, 13, 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, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,
+111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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,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,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,111,117,116, 99,
+111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,
+123, 13, 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, 13,
+ 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114,
+ 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13, 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, 13, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10,  9,
+  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 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, 13, 10,  9,  9,  9,111,117,116,
+ 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 10,  9,  9,101,108,115,101, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46,
+114, 32, 61, 32,116,109,112, 59, 13, 10,  9,125, 13, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46,
+ 48, 41, 32,123, 13, 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, 13, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10,  9,  9,  9,111,117,116, 99,
+111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 13, 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, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32,
+ 61, 32, 49, 46, 48, 59, 13, 10,  9,  9,101,108,115,101, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,
+112, 59, 13, 10,  9,125, 13, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13, 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, 13,
+ 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61,
+ 32, 49, 46, 48, 59, 13, 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, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59,
+ 13, 10,  9,  9,101,108,115,101, 13, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 13, 10,  9,125,
+ 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 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, 13, 10,  9,105,102, 40,116,109,112, 32,
+ 60, 61, 32, 48, 46, 48, 41, 13, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 13, 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, 13, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48,
+ 46, 48, 59, 13, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 13, 10,  9,  9,111,117,116, 99,
+111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
+ 32,116,109,112, 59, 13, 10, 13, 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, 13, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32,
+ 61, 32, 48, 46, 48, 59, 13, 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, 13, 10,  9,  9,
+111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32,
+ 49, 46, 48, 41, 13, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 13, 10,  9,101,108,115,101, 13, 10,
+  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 13, 10, 13, 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, 13, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13,
+ 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 13, 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, 13, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 13, 10,  9,101,108,
+115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 13, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49,
+ 46, 48, 59, 13, 10,  9,101,108,115,101, 13, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13,
+ 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,
+115,118, 50, 44, 32,116,109,112, 59, 13, 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, 13, 10, 13, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13, 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, 13, 10,  9,  9,104,115,118, 46,120,
+ 32, 61, 32,104,115,118, 50, 46,120, 59, 13, 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, 13, 10, 13, 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, 13, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13,
+ 10,  9,125, 13, 10,125, 13, 10, 13, 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, 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, 50, 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, 50, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,118,101, 99, 50, 40,102, 97, 99, 44,
- 32, 48, 46, 48, 41, 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,
+ 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10,  9,118,101, 99, 52, 32,
+104,115,118, 44, 32,104,115,118, 50, 59, 13, 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, 13, 10, 13, 10,  9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13, 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, 13, 10, 13, 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, 13, 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, 13, 10,  9,125, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13,
+ 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 13, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,
+111,108, 49, 44, 32,104,115,118, 41, 59, 13, 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, 13, 10, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10,  9,118,101,
+ 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 13, 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, 13, 10, 13, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46,
+ 48, 41, 32,123, 13, 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,
+ 13, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 13, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,104,
+115,118, 50, 46,121, 59, 13, 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,
+ 13, 10, 13, 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, 13, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,  9,125, 13,
+ 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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,
+ 13, 10, 13, 10,  9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108,
+ 49, 59, 13, 10, 13, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 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, 13, 10,
+ 13, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 13, 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, 13, 10,  9,101,108,115,101, 13, 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, 13, 10, 13, 10,  9,105,
+102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 13, 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, 13,
+ 10,  9,101,108,115,101, 13, 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, 13, 10,125, 13, 10, 13, 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, 50, 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, 13, 10,123, 13, 10,  9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,
+116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,118,101, 99, 50, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 41,
+ 59, 13, 10,  9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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,
+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, 13, 10,125, 13,
+ 10, 13, 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, 13, 10,123, 13, 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, 13, 10,  9,111,117,116, 99,111,
+108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,118,101, 99, 52, 32,104,115,118, 59, 13, 10, 13, 10,  9,114,103, 98, 95,
+116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 13, 10, 13, 10,  9,104,115,118, 91, 48, 93, 32, 43, 61, 32,
+ 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 13, 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, 13, 10,  9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 13, 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, 13, 10,  9,104,
+115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 13, 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, 13, 10, 13, 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, 13, 10, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,114, 32,
+ 61, 32, 99,111,108, 46,114, 59, 13, 10,  9,103, 32, 61, 32, 99,111,108, 46,103, 59, 13, 10,  9, 98, 32, 61, 32, 99,111,108, 46,
+ 98, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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,
+ 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10, 13, 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, 13, 10,123, 13, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 13, 10,
+125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,  9,111,117,116,118,
+ 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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,